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

}


目录
相关文章
|
3月前
|
JSON PHP 数据格式
原生php实现列表接口+分页接口+排序接口组合使用+包括测试数据(不加任何封装)
原生php实现列表接口+分页接口+排序接口组合使用+包括测试数据(不加任何封装)
原生php实现列表接口+分页接口+排序接口组合使用+包括测试数据(不加任何封装)
|
3月前
|
存储 关系型数据库 MySQL
PHP 如何使用 Excel 处理数据
【1月更文挑战第1天】PHP 如何使用 Excel 处理数据
41 1
|
6月前
|
小程序 前端开发 PHP
PHP实现生成小程序二维码带参数进入指定页面、小程序URL scheme实现携带数据跳转小程序
PHP实现生成小程序二维码带参数进入指定页面、小程序URL scheme实现携带数据跳转小程序
php案例:$_ENV的数据怎么样才能显示出来.$_ENV的简单运用
php案例:$_ENV的数据怎么样才能显示出来.$_ENV的简单运用
php案例:$_ENV的数据怎么样才能显示出来.$_ENV的简单运用
php案例:用代码的方式创建目录+文件+写入数据(都由你定)
php案例:用代码的方式创建目录+文件+写入数据(都由你定)
php案例:用代码的方式创建目录+文件+写入数据(都由你定)
|
3月前
|
JSON PHP 数据格式
php 删掉空的数组 json数据. 空数据(false 0 ““ null)
php 删掉空的数组 json数据. 空数据(false 0 ““ null)
php 删掉空的数组 json数据. 空数据(false 0 ““ null)
|
3月前
|
JSON PHP 数据格式
php对‘[{“id“:“1“,“name“:“cyg”},{“id“:“2“,“name“:“liwen“}]json数据进行修改删除操作
php对‘[{“id“:“1“,“name“:“cyg”},{“id“:“2“,“name“:“liwen“}]json数据进行修改删除操作
php对‘[{“id“:“1“,“name“:“cyg”},{“id“:“2“,“name“:“liwen“}]json数据进行修改删除操作