扫码关注官方订阅号
84669人学习
65727人学习
82984人学习
467778人学习
498837人学习
471966人学习
256484人学习
152542人学习
224170人学习
139536人学习
81804人学习
85022人学习
11944人学习
20001人学习
60816人学习
5487人学习
15007人学习
2150人学习
6980人学习
194925人学习
359900人学习
1142人学习
19058人学习
3206人学习
180550人学习
48569人学习
17603人学习
40936人学习
1049人学习
750人学习
32909人学习
最近在批量迁移数据写入到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);
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
扫描下载App
Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
精品班
技术支持
技术咨询
学习群
会员优惠
返回顶部