하나의 쿼리로 여러 행 삽입 MySQL
여러 개의 삽입 쿼리에 대한 기능이 있는 스크립트를 쓰고 싶습니다.더 잘 설명해 드릴게요.
하나 있어.quantity
html 형식으로 입력해 주세요.그리고 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단계를 수행해야 합니다.
- 트랜잭션 시작(자동 커밋 모드 사용 안 함
- 준비한다.
INSERT
진술 - 여러 번 실행
데이터베이스 트랜잭션을 사용하면 데이터가 한 곳에 저장되고 성능이 크게 향상됩니다.
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
'programing' 카테고리의 다른 글
Vue에서 플러그인에서 생성, 메서드, 마운트 등의 글로벌 기능을 추가하는 방법 (0) | 2023.02.03 |
---|---|
MySQL 5.6에서 5.7로 이행한 이후 MySQL JOIN은 < > 연산자를 사용하여 WHERE 절을 필터링하지 않았습니다. (0) | 2023.01.24 |
Laravel 스타일시트 및 javascript는 기본이 아닌 경로에서는 로드되지 않습니다. (0) | 2023.01.24 |
다른 Vuex 모듈에서 변환 커밋 (0) | 2023.01.24 |
하이버네이트 HQL 결과를 사용하여 타입 안전 경고를 회피하는 방법 (0) | 2023.01.24 |