MYSQL 处理批量更新数据的一些经验。

时间:2021-11-30 22:25:01

首先,我们需要了解下MYSQL CASE EXPRESSION 语法。

手册传送门:http://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html

有关这个的讨论的*:http://*.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 处理批量更新数据的一些经验。的更多相关文章

  1. 【mysql】批量更新数据

    概述 批量更新mysql数据表数据,上网搜索基本都会说4~5方法,本人使用的更新方式为: INSERT ... ON DUPLICATE KEY UPDATE Syntax 可参见官方网站:inser ...

  2. mysql 常用命令,连接数据库,查看建表语句,批量导入数据,批量更新数据,连接查询

    1. 1)MySQL 连接本地数据库,从cmd中进入mysql命令编辑器: root root分别为用户名和密码 mysql -uroot -proot 2)MySQL 连接本地数据库,用户名为“ro ...

  3. mysql下的将多个字段名的值复制到另一个字段名中(批量更新数据)字符串拼接cancat实战例子

    mysql下的将多个字段名的值复制到另一个字段名中(批量更新数据)mysql字符串拼接cancat实战例子: mysql update set 多个字段相加,如果是数字相加可以直接用+号(注:hund ...

  4. mybatis学习之路----批量更新数据两种方法效率对比

    原文:https://blog.csdn.net/xu1916659422/article/details/77971696/ 上节探讨了批量新增数据,这节探讨批量更新数据两种写法的效率问题. 实现方 ...

  5. FreeSql (十四)批量更新数据

    FreeSql支持丰富的更新数据方法,支持单条或批量更新,在特定的数据库执行还可以返回更新后的记录值. var connstr = "Data Source=127.0.0.1;Port=3 ...

  6. mysql:批量更新

    (优化前)一般使用的批量更新的方法: foreach ($display_order as $id => $ordinal) {     $sql = "UPDATE categori ...

  7. 批量更新数据小心SQL触发器的陷阱

    批量更新数据时候,Inserted和Deleted临时表也是批量的,但触发器只会调用执行一次!两个概念千万不要弄混淆! 错误的理解:例如:创建在A表上创建了一个Update触发器,里面写的是Updat ...

  8. Neo4j 第五篇:批量更新数据

    相比图形数据的查询,Neo4j更新图形数据的速度较慢,通常情况下,Neo4j更新数据的工作流程是:每次数据更新都会执行一次数据库连接,打开一个事务,在事务中更新数据.当数据量非常大时,这种做法非常耗时 ...

  9. SQL批量更新数据

    SQL批量更新数据 step1:导入Excel数据, 具体见百度.注意点:一列中含有float型数据和文本数据的时候,导入要将Excel中的表格属性改成文本,或在数字项目前加个单引号.   step2 ...

随机推荐

  1. C# XML操作

    一.简单介绍 using System.Xml; //初始化一个xml实例 XmlDocument xml=new XmlDocument(); //导入指定xml文件 xml.Load(path); ...

  2. java中内部类使用小结

    内部类是指在一个外部类中再定义一个类,类名不需要和文件名相同 内部类可以是静态的,类的修饰符可以是private,default,protect,public修饰 ,而外部类只能是public 和 d ...

  3. Windows C++ 子目录数量

    CFileFind OneFile; BOOL bWorking = FALSE; ; ) != "\\") { strPath += "\\*.*"; } b ...

  4. Java基础之一组有用的类——使用正则表达式查找和替换(SearchAndReplace)

    控制台程序. 使用正则表达式执行查找和替换操作,只需要调用Matcher对象的find()方法,就可以调用appendReplacement()方法来替换匹配的子序列.在提供给方法的新StringBu ...

  5. Picker组件封装

    在开发APP的过程中,我们可能会遇上软件中需要有很多下拉选择样式,就像之前我做的那个<房贷计算器>一样,有很多下拉选择,如果没有将Picker封装起来共用是很麻烦的. 安装插件 在Reac ...

  6. 关于优化C&num;程序的五十种方法

    一.用属性代替可访问的字段 1..NET数据绑定只支持数据绑定,使用属性可以获得数据绑定的好处: 2.在属性的get和set访问器重可使用lock添加多线程的支持. 二.readonly(运行时常量) ...

  7. Dreamweaver使用过程的小技巧

    在用Dreamweaver中制作网站的过程中,经常会遇到这样的问题,我们要修改一些属性类的标签,如<a href="abc/def.html">,如果我们要把href= ...

  8. (7)STM32使用HAL库实现RS485通讯(全双工串口)

    一.硬件 如下图所示,485芯片链接到单片机的USART2上,但是默认的USART2并不是在PD5和PD6上,这里是需要重映射的.另外PG4作为485收发的控制(在485协议中,RE.DE同时为高电平 ...

  9. 解决vs启动出现&OpenCurlyDoubleQuote;cannot find one or more components &period;Please reinstall the application”

    参考下文: https://blog.csdn.net/novice_growth/article/details/71627395

  10. Linux之磁盘分区

    一.基础知识 1.磁盘分区 磁盘的分区主要分为基本分区(primary partion)和扩充分区(extension partion)两种,基本分区和扩充分区的数目之和不能大于四个.且基本分区可以马 ...