MYSQL 处理批量更新数据的一些经验。
首先,我们需要了解下MYSQL CASE EXPRESSION 语法。
手册传送门:http://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html
有关这个的讨论的stackoverflow:http://stackoverflow.com/questions/29205842/can-mysql-case-expression-running-well-with-the-same-when-condition
看完以上,你就会少走很多弯路。
我有很多条记录需要更新不同的值怎么办呢?
我们可以这样:
UPDATE activity
SET number = CASE
WHEN aid = 45 THEN
number + 1
WHEN aid = 43 THEN
number + 1
END
WHERE
aid IN (45, 43)
或者这样:
UPDATE activity
SET number = CASE aid
WHEN 45 THEN
number + 1
WHEN 43 THEN
number + 1
END
WHERE
aid IN (45, 43)
这个语法和程序语言中的switch case控制流差不多意思,但是有几点需要注意:
ex1:
UPDATE activity
SET number = CASE
WHEN aid = 45 THEN
number + 1
WHEN aid = 43 THEN
number + 1
WHEN aid = 45 THEN
number + 3
WHEN aid = 49 THEN
number + 1
WHEN aid = 45 THEN
number + 1
END
WHERE
aid IN (45, 43,49)
看到了吗?会不会有人一开始像我一样认为aid=45 的number+5的?放心....aid=45 的number就仅仅加了1.换句话说也就是第一个when aid=45 then number+1执行了!第二次再碰到when aid=45的时候,系统就认为这个条件已经执行过了,后门的aid=45就直接跳过不执行的了,但是中间的aid=43 aid=49的还是可以正常执行的!
也就是说,所有相同的when条件就只执行第一次!
ex2:
UPDATE activity
SET number = CASE aid
WHEN 45 THEN
number + 1
WHEN 43 THEN
number + 1
END
这个你觉得会怎么样?貌似和上面的没啥不同啊?这个就糟糕了.....如果没有约束条件,那么aid=45 aid=43的number+1以外,别的aid都会set number=null.....这就好像你用简单版的update set没有写where条件来约束范围的情况一样。小心小心.....
这里只讨论了如何使用CASE EXPRESSION 来进行批量更新.....
无论是insert 或者update,批量处理总是要比一个个来的要效率,当然这里指的是一般情况下的使用。最后来看看在PHP下使用批量更新的处理方案:
/*
$aids is an array which the key is the activity's primary key and the
value is the activity's number.
example $aids = array('45'=>4,'43'=>1...)
In the array,i combine all the same aid to one element.so one aid can
not be used twice by the case expression.And all the number are total
number.
*/
$sql = 'update huodong_activity set applynumber = case ';
$aids_str = implode(',',array_keys($aids));
foreach($aids as $k=>$v){
$sql .= sprintf(' when aid = %d then applynumber-%d',$k,$v);
}
$sql .= ' END WHERE aid IN ('.$aids_str.') ';
$db->query($sql);
MYSQL 处理批量更新数据的一些经验。的更多相关文章
- 【mysql】批量更新数据
概述 批量更新mysql数据表数据,上网搜索基本都会说4~5方法,本人使用的更新方式为: INSERT ... ON DUPLICATE KEY UPDATE Syntax 可参见官方网站:inser ...
- mysql 常用命令,连接数据库,查看建表语句,批量导入数据,批量更新数据,连接查询
1. 1)MySQL 连接本地数据库,从cmd中进入mysql命令编辑器: root root分别为用户名和密码 mysql -uroot -proot 2)MySQL 连接本地数据库,用户名为“ro ...
- mysql下的将多个字段名的值复制到另一个字段名中(批量更新数据)字符串拼接cancat实战例子
mysql下的将多个字段名的值复制到另一个字段名中(批量更新数据)mysql字符串拼接cancat实战例子: mysql update set 多个字段相加,如果是数字相加可以直接用+号(注:hund ...
- mybatis学习之路----批量更新数据两种方法效率对比
原文:https://blog.csdn.net/xu1916659422/article/details/77971696/ 上节探讨了批量新增数据,这节探讨批量更新数据两种写法的效率问题. 实现方 ...
- FreeSql (十四)批量更新数据
FreeSql支持丰富的更新数据方法,支持单条或批量更新,在特定的数据库执行还可以返回更新后的记录值. var connstr = "Data Source=127.0.0.1;Port=3 ...
- 技术分享 | 在MySQL对于批量更新操作的一种优化方式
欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 作者:景云丽.卢浩.宋源栋 GreatSQL社区原创内容未经授权不得随意使用,转 ...
- mysql:批量更新
(优化前)一般使用的批量更新的方法: foreach ($display_order as $id => $ordinal) { $sql = "UPDATE categori ...
- 批量更新数据小心SQL触发器的陷阱
批量更新数据时候,Inserted和Deleted临时表也是批量的,但触发器只会调用执行一次!两个概念千万不要弄混淆! 错误的理解:例如:创建在A表上创建了一个Update触发器,里面写的是Updat ...
- Neo4j 第五篇:批量更新数据
相比图形数据的查询,Neo4j更新图形数据的速度较慢,通常情况下,Neo4j更新数据的工作流程是:每次数据更新都会执行一次数据库连接,打开一个事务,在事务中更新数据.当数据量非常大时,这种做法非常耗时 ...
随机推荐
- mac office 激活
详见:http://blog.csdn.net/tech4j/article/details/47953311
- idea中配置eslint 静态代码检查
配置: 1,安装依赖 sudo tnpm install eslint -g sudo tnpm install eslint-plugin-import -g sudo tnpm install e ...
- 转:eclipse打开文件或者目录位置(不使用插件)
http://my.oschina.net/havoc/blog/204958?p= 首先说不使用插件的方法 WINDOWS eclipse配置 Run-->External Tools--&g ...
- 前端静态资源版本更新与缓存之——gulp自动化添加版本号
公司项目每次发布后,偶尔会有缓存问题,然后看了下gulp,发现gulp还能给js,css自动化添加版本号,可解决缓存的问题,所以自动化实现静态资源的版本更新才是正道.通过网上的资料试过了两种办法: 1 ...
- JavaScript获取浏览器类型与版本
从网上找到一段使用JavaScript判断浏览器以及浏览器版本的比较好的代码,在此记录一下: <script type="text/javascript"> var S ...
- js 获取URL传递过来的值
URL: http://127.0.0.1:8080/jspews/pews/inspection/InspectCheckCard.jsp?checkDate=2015-03-31 传递的值: ch ...
- table中的th td margin不生效
margin-top,margin-left,margin-right,margin-bottom 是body中的属性th,td 是表格的元素与之对应的是padding-top,padding-lef ...
- 改善C#程序,提高程序运行效率的50种方法
改善C#程序,提高程序运行效率的50种方法 转自:http://blog.sina.com.cn/s/blog_6f7a7fb501017p8a.html 一.用属性代替可访问的字段 1..NET ...
- 深度学习(DNN)的学习网站
近期决定对深度学习稍微学习一下,因此搜集了一些相关的网站和资料,特分享给大家. 首先,如果你对机器学习还不甚了解,最好先了解一下其相关的概念,推荐 Andrew Ng在斯坦福的机器学习教程 (中文翻译 ...
- Codeforces Round #374 (Div. 2) D. Maxim and Array
传送门 分析:其实没什么好分析的.统计一下负数个数.如果负数个数是偶数的话,就要尽量增加负数或者减少负数.是奇数的话就努力增大每个数的绝对值.用一个优先队列搞一下就行了. 我感觉这道题的细节极为多,非 ...