最近在批量迁移数据写入到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);