<legend id="ra9il"><dl id="ra9il"></dl></legend>

  • <legend id="ra9il"><dl id="ra9il"></dl></legend>
  • <legend id="ra9il"><dl id="ra9il"></dl></legend>

    <optgroup id="ra9il"></optgroup>

    <span id="ra9il"><output id="ra9il"></output></span>
    <ol id="ra9il"></ol>
    <ol id="ra9il"></ol>

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


    0/300
    全部评价
    今开奖结果-今期开奖结果现场-今期开奖结果直