博客列表 >mysql批量写入数据时,注意事项

mysql批量写入数据时,注意事项

JasonKim的博客
JasonKim的博客原创
2019年04月25日 16:56:302896浏览

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


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议