programing

하나의 쿼리로 여러 행 삽입 MySQL

projobs 2023. 1. 24. 09:53
반응형

하나의 쿼리로 여러 행 삽입 MySQL

여러 개의 삽입 쿼리에 대한 기능이 있는 스크립트를 쓰고 싶습니다.더 잘 설명해 드릴게요.

하나 있어.quantityhtml 형식으로 입력해 주세요.그리고 MySQL 쿼리를 삽입해야 합니다.registered user테이블로 이동합니다.그래서 이 쿼리를 삽입할 수 있는 시간을 지정합니다.

 mysql_query("INSERT INTO `pxlot` (realname,email,address,phone,status,regtime,ip) 
 VALUES ('$realname','$email','$address','$phone','0','$dateTime','$ip')")
 or die (mysql_error()); // Inserts the user.

예를 들어 이것을 3번 삽입하는 것.좋은 의견이라도 있나?

 INSERT INTO table (a,b) VALUES (1,2), (2,3), (3,4);

http://dev.mysql.com/doc/refman/5.5/en/insert.html

대부분의 경우 하나의 Insert 문을 사용하여 여러 레코드를 삽입하는 것이 PHP에 for/foreach 루프를 사용하여 레코드를 삽입하는 것보다 MySQL에서 훨씬 빠릅니다.

$column1과 $column2가 html 형식으로 게시된 동일한 크기의 배열이라고 가정합니다.

다음과 같이 쿼리를 만들 수 있습니다.

<?php
    $query = 'INSERT INTO TABLE (`column1`, `column2`) VALUES ';
    $query_parts = array();
    for($x=0; $x<count($column1); $x++){
        $query_parts[] = "('" . $column1[$x] . "', '" . $column2[$x] . "')";
    }
    echo $query .= implode(',', $query_parts);
?>

두 레코드의 데이터가 게시되면 쿼리는 다음과 같이 됩니다.

테이블에 삽입(column1,column2) 값('데이터', '데이터', '데이터', '데이터')

여기 몇 가지 방법이 있습니다.

INSERT INTO pxlot (realname,email,address,phone,status,regtime,ip) 
select '$realname','$email','$address','$phone','0','$dateTime','$ip' 
from SOMETABLEWITHTONSOFROWS LIMIT 3;

또는

INSERT INTO pxlot (realname,email,address,phone,status,regtime,ip) 
select '$realname','$email','$address','$phone','0','$dateTime','$ip'
union all select '$realname','$email','$address','$phone','0','$dateTime','$ip'
union all select '$realname','$email','$address','$phone','0','$dateTime','$ip'

또는

INSERT INTO pxlot (realname,email,address,phone,status,regtime,ip) 
values ('$realname','$email','$address','$phone','0','$dateTime','$ip')
,('$realname','$email','$address','$phone','0','$dateTime','$ip')
,('$realname','$email','$address','$phone','0','$dateTime','$ip')

단일 행으로 여러 행을 삽입하는 동안INSERT스테이트먼트가 일반적으로 더 빠르고, 더 복잡하고 종종 안전하지 않은 코드로 이어집니다.아래에 PHP를 사용하여 여러 레코드를 한 번에 삽입하는 경우의 베스트 프랙티스를 제시하겠습니다.

여러 행을 동시에 데이터베이스에 삽입하려면 다음 3단계를 수행해야 합니다.

  1. 트랜잭션 시작(자동 커밋 모드 사용 안 함
  2. 준비한다.INSERT진술
  3. 여러 번 실행

데이터베이스 트랜잭션을 사용하면 데이터가 한 곳에 저장되고 성능이 크게 향상됩니다.

PDO를 사용하여 여러 행을 올바르게 삽입하는 방법

PDO는 PHP에서 데이터베이스 확장의 가장 일반적인 선택이며 PDO를 사용하여 여러 레코드를 삽입하는 것은 매우 간단합니다.

$pdo = new \PDO("mysql:host=localhost;dbname=test;charset=utf8mb4", 'user', 'password', [
    \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
    \PDO::ATTR_EMULATE_PREPARES => false
]);

// Start transaction
$pdo->beginTransaction();

// Prepare statement
$stmt = $pdo->prepare('INSERT 
    INTO `pxlot` (realname,email,address,phone,status,regtime,ip) 
    VALUES (?,?,?,?,?,?,?)');

// Perform execute() inside a loop
// Sample data coming from a fictitious data set, but the data can come from anywhere
foreach ($dataSet as $data) {
    // All seven parameters are passed into the execute() in a form of an array
    $stmt->execute([$data['name'], $data['email'], $data['address'], getPhoneNo($data['name']), '0', $data['regtime'], $data['ip']]);
}

// Commit the data into the database
$pdo->commit();

mysqli를 사용하여 여러 행을 올바르게 삽입하는 방법

mysqli 확장은 사용하기 좀 더 번거롭지만 매우 유사한 원리로 작동합니다.함수 이름이 다르며 매개 변수가 약간 다릅니다.

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new \mysqli('localhost', 'user', 'password', 'database');
$mysqli->set_charset('utf8mb4');

// Start transaction
$mysqli->begin_transaction();

// Prepare statement
$stmt = $mysqli->prepare('INSERT 
    INTO `pxlot` (realname,email,address,phone,status,regtime,ip) 
    VALUES (?,?,?,?,?,?,?)');

// Perform execute() inside a loop
// Sample data coming from a fictitious data set, but the data can come from anywhere
foreach ($dataSet as $data) {
    // mysqli doesn't accept bind in execute yet, so we have to bind the data first
    // The first argument is a list of letters denoting types of parameters. It's best to use 's' for all unless you need a specific type
    // bind_param doesn't accept an array so we need to unpack it first using '...'
    $stmt->bind_param('sssssss', ...[$data['name'], $data['email'], $data['address'], getPhoneNo($data['name']), '0', $data['regtime'], $data['ip']]);
    $stmt->execute();
}

// Commit the data into the database
$mysqli->commit();

성능

두 확장 모두 트랜잭션을 사용할 수 있는 기능을 제공합니다.트랜잭션과 함께 준비된 문을 실행하면 성능이 크게 향상되지만 단일 SQL 쿼리만큼 성능이 향상되지는 않습니다.그러나 그 차이는 무시할 수 있을 정도로 작기 때문에 간결성과 깨끗한 코드를 위해 준비된 문장을 여러 번 실행하는 것이 완벽하게 허용됩니다.데이터베이스에 많은 레코드를 동시에 삽입할 수 있는 더 빠른 옵션이 필요한 경우 PHP가 올바른 도구가 아닐 수 있습니다.

여러 값을 삽입하는 경우, 예를 들어 투고 값은 다르지만 삽입할 테이블은 동일한 여러 입력에서 다음과 같이 입력합니다.

mysql_query("INSERT INTO `table` (a,b,c,d,e,f,g) VALUES 
('$a','$b','$c','$d','$e','$f','$g'),
('$a','$b','$c','$d','$e','$f','$g'),
('$a','$b','$c','$d','$e','$f','$g')")
or die (mysql_error()); // Inserts 3 times in 3 different rows

언급URL : https://stackoverflow.com/questions/12502032/insert-multiple-rows-with-one-query-mysql

반응형