博主信息
博文 11
粉丝 0
评论 1
访问量 19191
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
mysql批量写入数据时,注意事项
JasonKim的博客
原创
3854人浏览过

最近在批量迁移数据写入到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举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学