使用 INSERT 语句合并插入
MySQL里面是可以使用insert语句进行合并插入的,比如:INSERT INTO user_info (name, age) VALUES ('name1', 18), ('name2', 19);
表示一次插入两条数据.
实际操作:
1. 连接数据库
<?php
#########################
### PDO连接MySQL数据库 ###
#########################
$pdo = new PDO('mysql:host=localhost;dbname=www_ooo_net', 'www_ooo_net', 'www_ooo_net');
$pdo->exec('set names utf8');
// 数据
$arr = array(
array(
'name' => 'zhao',
'age' => '14'
),
array(
'name' => 'qian',
'age' => '15'
),
array(
'name' => 'sun',
'age' => '16'
),
array(
'name' => 'li',
'age' => '17'
),
array(
'name' => 'zhou',
'age' => '18'
),
array(
'name' => 'wu',
'age' => '19'
),
array(
'name' => 'zheng',
'age' => '20'
),
array(
'name' => 'wang',
'age' => '21'
),
array(
'name' => 'feng',
'age' => '22'
),
array(
'name' => 'chen',
'age' => '23'
),
);
2. 执行流程
<?php
$costBegin = microtime(true);
if (!empty($arr)) {
$sql = sprintf("INSERT INTO wdce (name, age) VALUES ");
foreach ($arr as $item) {
$itemStr = '( ';
$itemStr .= sprintf("'%s', %d", $item['name'], (int)$item['age']);
$itemStr .= '),';
$sql .= $itemStr;
}
// 去除最后一个逗号,并且加上结束分号
$sql = rtrim($sql, ',');
$sql .= ';';
try {
// 成功返回结果条数
$res = $pdo->exec($sql);
if (!empty($res)) {
echo '<pre>';
var_dump('成功插入' . $res . '条数据');
// 插入成功后返回插入数据的ID
var_dump($pdo->lastinsertid());
} else {
echo "Error: " . $sql . "<br>" . $pdo->error;
}
} catch (Exception $e) {
$pdo->rollBack();
echo "插入失败: " . $e->getMessage();
}
}
如果你觉得数组太大,想要减少SQL错误的风险,也可以使用array_chunk()函数
将数组切成指定大小的块,然后对每个块进行 INSERT 合并插入.
<?php
foreach ($new_arr as $k => $v) {
$sqls = sprintf("INSERT INTO wdce (name, age) VALUES ");
foreach ($v as $items) {
$itemStrs = '( ';
$itemStrs .= sprintf("'%s', %d", $items['name'], (int)$items['age']);
$itemStrs .= '),';
$sqls .= $itemStrs;
}
// 去除最后一个逗号,并且加上结束分号
$sqls = rtrim($sqls, ',');
$sqls .= ';';
try {
// 成功返回结果条数
$res = $pdo->exec($sqls);
if (!empty($res)) {
echo '<pre>';
var_dump('成功插入' . $res . '条数据');
} else {
echo "Error: " . $sqls . "<br>" . $pdo->error;
}
} catch (Exception $e) {
$pdo->rollBack();
echo "插入失败: " . $e->getMessage();
}
}