最近在批量迁移数据写入到mysql表中的时候,出现一下报错。
SQLSTATE[HY000]: General error: 1390 Prepared statement contains too many placeholders.
查看mysql官网解释:
Error: 1390 SQLSTATE: HY000 (ER_PS_MANY_PARAM)
Message: Prepared statement contains too many placeholders
原因分析:
mysql使用PDO进行写入的时候,PDO支持最大占位符为65535。
当insert的表为6列(即6个字段),写入记录的行数为11000时,则insert的总占位符为:6x11000=66000.
66000大于mysql最大占位符为65535,故而mysql报错。
结论:写入数据为m列,n行。m*n必须小于65535。
我的解决办法是:
例子:数据量2千条,字段50个;
将数组进行拆分;每1千条数据为一组,进行批量写入;
使用array_slice()进行拆分!
$limit = 1000;// 每组1千条数据
$ArrCount = count($Orders);// 获取数组总数
// 如果数组总数大于1000 就进行分数组插入
if($ArrCount > $limit) {
// 计算要分成多少个数组;
$arrCount = ceil($ArrCount/$limit);// 向上取整
for($i=0;$i<$arrCount;$i++) {
$tmp = [];
// 开始截取的位置
$start = ($limit * $i); // 1000-1 * 0 = 0
// 每次取一千条 数组分组
$tmp = array_slice($Orders,$start,$limit);
//数据不为空就写入数组新数组中
if(!empty($tmp)) {
// 写入临时订单表,将分组后的数组写入表中
$res = DB::table('customs_elec_order_tmp')->insert($tmp);
if(!empty($res)) {
$flag = true;
}
}
$tmp = [];
}
// 释放内存
unset($Orders);
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号