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);

}


目录
相关文章
|
6月前
|
SQL 安全 程序员
PHP编程中的关键性错误及解决方法
在PHP编程过程中,程序员常常会遇到一些关键性错误,这些错误可能会导致程序运行异常甚至崩溃。本文将重点探讨PHP编程中常见的关键性错误,并提供解决方法,帮助程序员更好地应对这些问题,提高编程效率和代码质量。
39 1
|
6月前
|
JSON PHP 数据格式
|
6天前
|
XML 前端开发 JavaScript
PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑
本文深入探讨了PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑;Ajax则通过异步请求实现页面无刷新更新。文中详细介绍了两者的工作原理、数据传输格式选择、具体实现方法及实际应用案例,如实时数据更新、表单验证与提交、动态加载内容等。同时,针对跨域问题、数据安全与性能优化提出了建议。总结指出,PHP与Ajax的结合能显著提升Web应用的效率和用户体验。
22 3
|
13天前
|
关系型数据库 MySQL 数据库连接
13 PHP数据的获取
路老师在知乎上分享了PHP语言的知识,帮助大家入门和深入理解PHP。本文介绍了从结果集中获取一行数据作为对象(`mysqli_fetch_object()`)、获取一行作为枚举数组(`mysqli_fetch_row()`)、获取查询结果集中的记录数(`mysqli_num_rows()`)、释放内存(`mysqli_free_result()`)以及关闭数据库连接(`mysqli_close()`)的方法,并提供了具体示例代码。
26 3
|
20天前
|
JSON 缓存 前端开发
PHP如何高效地处理JSON数据:从编码到解码
在现代Web开发中,JSON已成为数据交换的标准格式。本文探讨了PHP如何高效处理JSON数据,包括编码和解码的过程。通过简化数据结构、使用优化选项、缓存机制及合理设置解码参数等方法,可以显著提升JSON处理的性能,确保系统快速稳定运行。
|
3月前
|
数据采集 PHP
PHP中实现简单爬虫与数据解析
【8月更文挑战第31天】在互联网的海洋里,爬虫技术如同一艘探索船,帮助我们搜集和理解信息。本文将带你通过PHP语言,轻松实现一个简单的网页内容抓取工具,并展示如何从抓取的数据中解析出有用信息。我们将一起航行在代码的波浪中,体验从无到有构建一个基本爬虫的过程。
|
3月前
|
数据采集 JavaScript 数据挖掘
如何使用 PHP Simple HTML DOM Parser 轻松获取网页中的特定数据
本文介绍了使用PHP Simple HTML DOM Parser进行网页数据抓取的方法,尤其适用于从懂车帝二手车网站提取汽车品牌、价格和里程等关键信息。首先,安装并配置所需库,使用代理IP和设置cookie与useragent来模拟用户行为,避免被封。然后,通过编写PHP脚本,利用cURL获取网页内容,解析HTML并提取所需数据,最终将数据保存至CSV文件。文章强调了正确配置代理和用户代理的重要性,并提供了完整的PHP代码示例,以帮助读者理解和应用网页抓取技术。
如何使用 PHP Simple HTML DOM Parser 轻松获取网页中的特定数据
|
3月前
|
应用服务中间件 Linux 网络安全
【Azure 应用服务】PHP应用部署在App Service for Linux环境中,上传文件大于1MB时,遇见了413 Request Entity Too Large 错误的解决方法
【Azure 应用服务】PHP应用部署在App Service for Linux环境中,上传文件大于1MB时,遇见了413 Request Entity Too Large 错误的解决方法
|
4月前
|
前端开发 PHP 数据格式
【附带效果视频】php接口给前端返回流式数据,php使用event-stream进行数据推送,循环一次输出一次
【附带效果视频】php接口给前端返回流式数据,php使用event-stream进行数据推送,循环一次输出一次
168 0
下一篇
无影云桌面