十几万条数据的表中,基于帝国cms 。自己亲身体验三种批量更新数据的方法,每一种的速度是什么样的
需求是 上传Excel 读取里面的数据。根据Excel中某一个字段,与数据表中的一个字段的唯一性。然后把 Excel表中数据和数据库表中数据一次更改。本次测试一次更新31条数据。 本次测试基于帝国cms
方法1 用一个for徐循环把读取的数据放在一个数组中然后在十几万条的数据表中逐条查询更改,用时35s;
$numArr = count($arr);
$m = ceil($numArr/10000);
for($i=1;$i<=$numArr;$i++){
$n = $i*10000;
$j = $n-10000;
for($q=$j;$q<$n;$q++){
$res = $empire->query("update {$dbtbpre}enewsclass set bname='".$arr[$i][1]."',classpagekey='".$arr[$i][2]."',intro='".$arr[$i][3]."' where classpath='".$arr[$i][i]."'");
if($res){
echo "更新成功!路径信息为:".$arr[$i][0];
}
}
}
方法 二;创建临时表。用时23s
$sqls ="DROP TABLE IF EXISTS `linshitbale`;\n";
$sqls .="create Temporary table linshitbale (id int(11) primary key auto_increment,classpath varchar(255),bname varchar(255),intro varchar(255),classpagekey varchar(255));\n";
$bsql ="";
foreach ($arr as $k => $v) {
$k+=1;
$bsql .="(".$k.",'".$v[0]."','".$v[1]."','".$v[3]."','".$v[2]."'),";
}
$bsql = trim($bsql,",");
$sqls .= "insert into linshitbale values ".$bsql.";\n";
$sqls .= "update {$dbtbpre}enewsclass as c,linshitbale as ls set c.bname=ls.bname,c.intro=ls.intro,c.classpagekey=ls.classpagekey where c.classpath = ls.classpath;";
echo $sqls;

第三种方法 :稍加修改批量更新的方法。用时0.9s
UPDATE mytable SET myfield1 = CASE id WHEN 1 THEN 'myvalue11' WHEN 2 THEN 'myvalue12' WHEN 3 THEN 'myvalue13' END, myfield2 = CASE id WHEN 1 THEN 'myvalue21' WHEN 2 THEN 'myvalue22' WHEN 3 THEN 'myvalue23' ENDWHERE id IN (1,2,3)$classpath = array();
$bname = array();
$intro = array();
$classpagekey = array();
foreach ($arr as $key => $value) {
$classpath[] = $value[0];
$bname[] = $value[1];
$intro[] = $value[3];
$classpagekey[] = $value[2];
}
$classpaths = implode("','", array_values($classpath));
$classpaths = "'".$classpaths."'";
$sql = "UPDATE {$dbtbpre}enewsclass\n SET bname = CASE classpath \n";
foreach ($bname as $k=>$v) {
$sql .= sprintf("WHEN '%s' THEN '%s' \n", $classpath[$k], $v);
}
$sql .= " END,\n intro = CASE classpath \n";
foreach ($intro as $key1 => $value1) {
$sql .=sprintf("WHEN '%s' THEN '%s' \n",$classpath[$key1],$value1);
}
$sql .= " END,\n classpagekey = CASE classpath \n";
foreach ($classpagekey as $key2 => $value2) {
$sql .=sprintf("WHEN '%s' THEN '%s' \n",$classpath[$key2],$value2);
}
$sql .= " END\n WHERE classpath IN ($classpaths)";
$result = $empire->query("$sql");
if($result){
echo "success";
}else{
echo "error";
}
如有不懂可以私聊我。qq 517190435
十几万条数据的表中,基于帝国cms 。自己亲身体验三种批量更新数据的方法,每一种的速度是什么样的的更多相关文章
- mysql 常用命令,连接数据库,查看建表语句,批量导入数据,批量更新数据,连接查询
1. 1)MySQL 连接本地数据库,从cmd中进入mysql命令编辑器: root root分别为用户名和密码 mysql -uroot -proot 2)MySQL 连接本地数据库,用户名为“ro ...
- 使用SqlBulkCopy批量插入多条数据进入表中
由于工作中项目需求结算一次生成一批相同批次号的数据插入一个表中,然后再通过另一页面展示出来,所以需要用到一次性插入一批数据,所以就采用了SqlBulkCopy插入一批数据 1 public stati ...
- 使用PreparedStatement向数据表中插入、修改、删除、获取Blob类型的数据
使用PreparedStatement向数据表中插入.修改.删除.获取Blob类型的数据 2014-09-07 20:17 Blob介绍 BLOB类型的字段用于存储二进制数据 MySQL中,BLOB是 ...
- FreeSql (十四)批量更新数据
FreeSql支持丰富的更新数据方法,支持单条或批量更新,在特定的数据库执行还可以返回更新后的记录值. var connstr = "Data Source=127.0.0.1;Port=3 ...
- mysql下的将多个字段名的值复制到另一个字段名中(批量更新数据)字符串拼接cancat实战例子
mysql下的将多个字段名的值复制到另一个字段名中(批量更新数据)mysql字符串拼接cancat实战例子: mysql update set 多个字段相加,如果是数字相加可以直接用+号(注:hund ...
- sqlserver 下三种批量插入数据的方法
本文将介绍三种批量插入数据的方法,需要的朋友可以参考下 本文将介绍三种批量插入数据的方法.第一种方法是使用循环语句逐个将数据项插入到数据库中:第二种方法使用的是SqlBulkCopy,使您可以用其他源 ...
- 【mysql】批量更新数据
概述 批量更新mysql数据表数据,上网搜索基本都会说4~5方法,本人使用的更新方式为: INSERT ... ON DUPLICATE KEY UPDATE Syntax 可参见官方网站:inser ...
- MySql中4种批量更新的方法update table2,table1,批量更新用insert into ...on duplicate key update, 慎用replace into.
mysql 批量更新记录 MySql中4种批量更新的方法最近在完成MySql项目集成的情况下,需要增加批量更新的功能,根据网上的资料整理了一下,很好用,都测试过,可以直接使用. mysql 批量更新共 ...
- 批量更新数据小心SQL触发器的陷阱
批量更新数据时候,Inserted和Deleted临时表也是批量的,但触发器只会调用执行一次!两个概念千万不要弄混淆! 错误的理解:例如:创建在A表上创建了一个Update触发器,里面写的是Updat ...
随机推荐
- 存储系列之 LUN 和 LVM
一.LUN 1.LUN的由来 上一篇文章已经介绍了RAID技术的原理,那么RAID的实现呢?有两种方式,RAID软件和RAID硬件.但是因软件RAID占用主机CPU和主机内存,而且RAID功能不易实现 ...
- Java内存虚拟机理解
对于Java程序员,在虚拟机自动内存管理机制的帮助下,不需要再为每一个操作写配对的释放资源操作,不容易出现内存泄露和内存溢出问题.加深对Java虚拟机的理解,有助于在发现问题时精准定位问题,排 ...
- Java并发编程入门(一)
一.为什么要并发? 出现背景:操作系统的出现,使计算机同时运行多个程序成为可能. 1.目的: 资源利用率.某些时候,程序必须等待一些外部操作完成(IO)才能继续运行,在等待时间运行其他程序,可以有效提 ...
- 【转】Mac系统常用快捷键大全
Mac系统常用快捷键大全 通用 Command是Mac里最重要的修饰键,在大多数情况下相当于Windows下的Ctrl.所以以下最基本操作很好理解: Command + Z 撤销 Command + ...
- C盘清理.bat
将以下代码复制到.txt文件中并改为.bat文件运行即可. @echo offecho 正在清除系统垃圾文件,请稍等......del /f /s /q %systemdrive%\*.tmpdel ...
- es6基础:类、继承、重写
es6真正的引入的面相对象的类,以前我们总是通过其他手段来模拟类这种形式,现在终于有了,我有点开心,又有点难过,因为在我看来,js并不是所谓的面相对象的语言,反而更偏向函数式,原型继承是他真正的面目. ...
- Meta标签基本使用
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><t ...
- CF1340B Nastya and Scoreboard(暴搜剪枝/dp)
Question 一个n个数码位的分数板,每一个数码位都是一个七段数码管,现在给出每个数码位的显示情况,问再点亮k段数码管的话能显示的最大的数是多少,如果不能构成一串数字,就输出-1 Solution ...
- 一文读懂JAVA多线程
背景渊源 摩尔定律 提到多线程好多书上都会提到摩尔定律,它是由英特尔创始人之一Gordon Moore提出来的.其内容为:当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍 ...
- linux 多线程 信号
一个老系统的问题,用的system v消息队列同步等响应,通过alarm信号来进行超时控制.现在系统进行升级改造(所谓云化),原来进程处理的逻辑全部改成了线程框架,问题就出现了.alarm信号发出的时 ...