php一次性大量数据入库解决方法

简介: php一次性大量数据入库解决方法

当有业务需求需要一次性循环n条数据,插入或更新数据库时,如果单纯的循环,插入/更新,会消耗太多的数据库资源


一下是一种简单的解决方案


数据库的insert 是可以批量更新的,当有大量数据循环insert时,可以将数据先保留不执行插入命令,到最后一条时一次性插入,例如tp的addAll()方法;


数据库的update 如果使用case when 的话,也是可以批量更新的,本人在百度上找到了一个基于tp的saveAll()方法,用于更新数据

本文主要讲关于批量insert;

例:


生成一个订单


正常情况的语句为:


INSERT INTO order (`goods_id`,`num`,`price`) VALUES (1,1,'10.00');

//封装成函数

functionadd_order($goods_id,$num,$price){

$db->query("INSERT INTO order (`goods_id`,`num`,`price`) VALUES ($goods_id,$num,$price)");

}

假设有一个用户,一次性将购物车的1000个商品结算成订单,生成1000个订单时;

for($i=0;$i<1000;$i++){

$db->query("INSERT INTO order (`goods_id`,`num`,`price`) VALUES ($goods_id,$num,$price)");

}

//这样的话会导致服务器资源占用过大,网站卡死

//所以,我们可以

$sql"INSERT INTO order (`goods_id`,`num`,`price`) VALUES ";

for($i=0;$i<1000;$i++){

    if($i==0){

    $sql.="($goods_id,$num,$price)";

    }else{

    $sql.=",($goods_id,$num,$price)";

    }

}

$db->query($sql);


大概意思就是这样了,批量更新实现比较麻烦一点,就不发了,以下是批量更新的sql执行语句


UPDATEtiyan.dm_user_cupboard SET`res_id` = CASE`id` WHEN1041 THEN'1'WHEN1058 THEN'1'WHEN1055 THEN'1'END,`food_code` = CASE`id` WHEN1041 THEN'68'WHEN1058 THEN'47'WHEN1055 THEN'49'END,`food_name` = CASE`id` WHEN1041 THEN'红枣'WHEN1058 THEN'莲藕'WHEN1055 THEN'洋葱'END,`num` = CASE`id` WHEN1041 THEN'2'WHEN1058 THEN'3'WHEN1055 THEN'2'END,`level` = CASE`id` WHEN1041 THEN'2'WHEN1058 THEN'2'WHEN1055 THEN'2'END,`update_time` = CASE`id` WHEN1041 THEN'2017-12-09 21:40:06'WHEN1058 THEN'2017-12-09 21:40:06'WHEN1055 THEN'2017-12-09 21:40:06'ENDWHEREid IN( 1041,1058,1055 )


附带基于tp的saveAll()

//批量更新

publicfunctionsaveAll($datas,$model){

    $model|| $model=$this->tableName);

    $model=empty($model)?$this->name:$model;

    $sql   ''//Sql

    $lists= []; //记录集$lists

    $pk    $this->getPk();//获取主键

    foreach($datasas$data) {

        foreach($dataas$key=>$value) {

            if($pk===$key){

                $ids[]=$value;

            }else{

                $lists[$key].= sprintf("WHEN %u THEN '%s' ",$data[$pk],$value);

            }

        }

    }

    foreach($listsas$key=> $value) {

        $sql.= sprintf("`%s` = CASE `%s` %s END,",$key,$pk,$value);

    }

    $sql= sprintf('UPDATE __%s__ SET %s WHERE %s IN ( %s )',strtoupper($model),rtrim($sql,','),$pk,implode(',',$ids));

    returnM()->execute($sql);

}


目录
相关文章
|
4月前
|
JSON 数据处理 PHP
PHP数组处理技巧:高效操作数据集合
PHP数组处理技巧:高效操作数据集合
|
4月前
|
JSON 安全 大数据
PHP中的数组处理艺术:灵活高效的数据操作
PHP中的数组处理艺术:灵活高效的数据操作
|
4月前
|
JSON 定位技术 PHP
PHP技巧:解析JSON及提取数据
这就是在PHP世界里探索JSON数据的艺术。这场狩猎不仅仅是为了获得数据,而是一种透彻理解数据结构的行动,让数据在你的编码海洋中畅游。通过这次冒险,你已经掌握了打开数据宝箱的钥匙。紧握它,让你在编程世界中随心所欲地航行。
163 67
|
7月前
|
数据库连接 PHP 数据库
【YashanDB知识库】PHP使用ODBC驱动无法获取长度为256char以上的数据
【YashanDB知识库】PHP使用ODBC驱动无法获取长度为256char以上的数据
|
7月前
|
Oracle 关系型数据库 MySQL
【YashanDB知识库】php查询超过256长度字符串,数据被截断的问题
本文分析了YashanDB中PHP通过ODBC查询数据时出现的数据截断问题,表现为超过256字节的数据被截断,以及isql工具无法显示超过300字节长度的数据。问题根源在于YashanDB的ODBC驱动仅支持单次查询,且PHP扩展库默认缓冲区限制。解决方案包括改用PHP ODBC扩展库而非PDO_ODBC,以及调整isql代码逻辑以支持循环取数或一次性读取完整数据。文章还提供了具体代码示例和规避方法,适用于23.2.4.14及更早版本。
【YashanDB知识库】php查询超过256长度字符串,数据被截断的问题
|
8月前
|
Oracle 关系型数据库 MySQL
【YashanDB 知识库】php 查询超过 256 长度字符串,数据被截断的问题
php 查询超过 256 字节数据,显示被截断:yashandb 的 odbc 驱动接口 SQLGetData 现在只支持单次查询,不支持多次取数据的操作。 isql 显示不出来,isql 工具最大只查询 300 长度的数据,超过了该长度未正常显示。
|
11月前
|
数据采集 JSON JavaScript
如何通过PHP爬虫模拟表单提交,抓取隐藏数据
本文介绍了如何使用PHP模拟表单提交并结合代理IP技术抓取京东商品的实时名称和价格,特别是在电商大促期间的数据采集需求。通过cURL发送POST请求,设置User-Agent和Cookie,使用代理IP绕过限制,解析返回数据,展示了完整代码示例。
230 3
如何通过PHP爬虫模拟表单提交,抓取隐藏数据
|
11月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
205 5
|
11月前
|
XML 前端开发 JavaScript
PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑
本文深入探讨了PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑;Ajax则通过异步请求实现页面无刷新更新。文中详细介绍了两者的工作原理、数据传输格式选择、具体实现方法及实际应用案例,如实时数据更新、表单验证与提交、动态加载内容等。同时,针对跨域问题、数据安全与性能优化提出了建议。总结指出,PHP与Ajax的结合能显著提升Web应用的效率和用户体验。
237 3
|
11月前
|
存储 SQL 数据处理
PHP中如何高效地处理大规模数据的排序?
在PHP中处理大规模数据排序时,选择合适的方法至关重要。对于内存内可以处理的数据,可以直接使用PHP内置排序函数;对于超出内存限制的数据,可以考虑分块处理、外部排序或利用数据库的排序功能。根据具体应用场景和数据规模,选择最佳的排序策略,确保排序操作高效且稳定。
115 2
下一篇
oss教程