通常情况下,我们会使用下面SQL语句来更新字段值:

复制代码代码例如以下:


UPDATE mytable SET myfield='value' WHERE other_field='other_value'; 

可是,假设你想更新多行数据,而且每行记录的各字段值都是各不一样,你会怎么办呢?举个样例,我的博客有三个分类文件夹(免费资源、教程指南、橱窗展示),这些分类文件夹的信息存储在数据库表categories中,而且设置了显示顺序字段
display_order,每一个分类占一行记录。假设我想又一次编排这些分类文件夹的顺序,比如改成(教程指南、橱窗展示、免费资源),这时就须要更新categories表对应行的display_order字段,这就涉及到更新多行记录的问题了,刚開始你可能会想到使用循环运行多条UPDATE语句的方式,就像下面的php程序演示样例:

复制代码代码例如以下:


foreach ($display_order as $id => $ordinal) { 

$sql="UPDATE categories SET display_order = $ordinal WHERE id = $id"; 

mysql_query($sql); 

} 

这样的方法并没有什么不论什么错误,而且代码简单易懂,可是在循环语句中运行了不止一次SQL查询,在做系统优化的时候,我们总是想尽可能的降低数据库查询的次数,以降低资源占用,同一时候能够提高系统速度。 

幸运的是,还有更好的解决方式,以下列举两种经常使用的方案仅仅只是SQL语句略微复杂点,可是仅仅需运行一次查询就可以,语法例如以下: 



•第一种:IF--THEN语句结合

复制代码代码例如以下:


UPDATE mytable 

SET myfield = CASE other_field 

WHEN 1 THEN 'value' 

WHEN 2 THEN 'value' 

WHEN 3 THEN 'value' 

END 

WHERE id IN (1,2,3) 

回到我们刚才的分类文件夹的样例,我们能够使用下面SQL语句:

复制代码代码例如以下:


UPDATE categories 

SET display_order = CASE id 

WHEN 1 THEN 3 

WHEN 2 THEN 4 

WHEN 3 THEN 5 

END, 

title = CASE id 

WHEN 1 THEN 'New Title 1' 

WHEN 2 THEN 'New Title 2' 

WHEN 3 THEN 'New Title 3' 

END 

WHERE id IN (1,2,3) 

以上方案大大降低了数据库的查询操作次数,大大节约了系统资源,可是该如何与我们的编程语言结合起来呢?我们还是用刚才分类文件夹的样例,下面是php的程序演示样例:

复制代码代码例如以下:


$display_order = array( 

1 => 4, 

2 => 1, 

3 => 2, 

4 => 3, 

5 => 9, 

6 => 5, 

7 => 8, 

8 => 9 

); 

$ids = implode(',', array_keys($display_order)); 

$sql = "UPDATE categories SET display_order = CASE id "; 

foreach ($display_order as $id => $ordinal) { 

$sql .= sprintf("WHEN %d THEN %d ", $id, $ordinal); // 拼接SQL语句 

} 

$sql .= "END WHERE id IN ($ids)"; 

echo $sql; 

mysql_query($sql); 

在这个样例中总共更新了8行数据,可是仅仅运行了一次数据库查询,相比于循环运行8次UPDATE语句,以上样例所节约的时间能够说是微不足道的。可是想想,当你须要更新10,0000或者很多其它行记录时,你会发现这当中的优点!唯一要注意的问题是SQL语句的长度,须要考虑程序运行环境所支持的字符串长度,我眼下获得的数据:SQL语句长度达到1,000,960在php中仍然能够顺利运行,我查询了php文档并没有发现明白规定字符串最大长度。 



•另外一种INSERT方式 

MySql中INSERT语法具有一个条件DUPLICATE KEY UPDATE,这个语法和适合用在须要推断记录是否存在,不存在则插入存在则更新的记录。 

基于上面这样的情况,针对更新记录,仍然使用insert语句,只是限制主键反复时,更新字段。例如以下:

复制代码代码例如以下:


INSERT INTO t_member (id, name, email) VALUES 

(1, 'nick', 'nick@126.com'), 

(4, 'angel','angel@163.com'), 

(7, 'brank','ba198@126.com') 

ON DUPLICATE KEY UPDATE name=VALUES(name), email=VALUES(email); 

注意:ON DUPLICATE KEY UPDATE仅仅是MySQL的特有语法,并非SQL标准语法!

mysql update改动多条数据的更多相关文章

  1. mysql查询随机几条数据(速度快)

    MySql查询随机几条数据 想到了 Max RAND 这几个函数 用以下2种办法都可以实现查询. 速度还行. 几十万数据左右, 没有什么问题. SELECT * FROM `news` WHERE i ...

  2. 复杂业务下向Mysql导入30万条数据代码优化的踩坑记录

    从毕业到现在第一次接触到超过30万条数据导入MySQL的场景(有点low),就是在顺丰公司接入我司EMM产品时需要将AD中的员工数据导入MySQL中,因此楼主负责的模块connector就派上了用场. ...

  3. 关于如何在mysql中插入一条数据后,返回这条数据的id

    简单的总结一下如何在mysql中出入一条数据后,返回该条数据的id ,假如之后代码需要这个id,这样做起来就变得非常方便,内容如下: <insert id="insertAndGetI ...

  4. 教你如何6秒钟往MySQL插入100万条数据!然后删库跑路!

    教你如何6秒钟往MySQL插入100万条数据!然后删库跑路! 由于我用的mysql 8版本,所以增加了Timezone,然后就可以了 前提是要自己建好库和表. 数据库test, 表user, 三个字段 ...

  5. Java 线程池 +生产者消费者+MySQL读取300 万条数据

    1.1需求 数据库300 万条用户数据 ,遍历获取所有用户, 各种组合关联, 获取到一个新的json ,存到redis 上. 1.2 难点 数据库比较多, 不可能单线程查询所有的数据到内存. 1.3解 ...

  6. mysql 中实现多条数据同时更新

    有时间我们需要对一张表进行批量数据的更新.首先我们想的是update 语句. 比如对一张订单表order_info 多条数据更新, update order_inifo set   order_cod ...

  7. mysql,给每一条数据的某一个字段生成不同的随机数

    UPDATE t_article ta-- 利用LEFT JOIN的方式进行关联修改 LEFT JOIN(-- 先通过查询的方式给每一条数据生成对应的10-500之间随机数 SELECT articl ...

  8. 【sql】mysql数据库做两条数据替换的操作,不使用第三方变量

    需求: 1.将数据库中两条数据中的唯一约束列  做值的替换 原始思想: 将两条数据查出来,在程序中设置第三方变量,进行两条数据的替换,然后将原始两条数据删除,将新的两条替换后的数据插入. 新思想: 1 ...

  9. 用一条mysql语句插入多条数据

    这篇文章主要介绍了在mysql中使用一条sql语句插入多条数据,效率非常高,但是原理其实很简单,希望对大家有所帮助 假如有一个数据表A: id name title addtime 如果需要插入n条数 ...

随机推荐

  1. ListView优化问题

    可以参考:http://blog.csdn.net/bill_ming/article/details/8817172和http://blog.csdn.net/xiangjai/article/de ...

  2. SDCard助手类

    package com.zyh.sdcardHelper; import java.io.BufferedInputStream; import java.io.BufferedOutputStrea ...

  3. 浅谈HTML之模仿人人网登陆界面(新手必学)

    为方便大家对web相关知识的了解,现谈谈新手如何从HTML css  Javascript到以后后台的发展.首先,让大家看看HTML仿人人登陆界面: <!doctype html> < ...

  4. 【译】在Asp.Net中操作PDF - iTextSharp - 绘制矢量图

    原文 [译]在Asp.Net中操作PDF - iTextSharp - 绘制矢量图 在上一篇iTextSharp文章中讲述了如何将现有的图片插入PDF中并对其进行操作.但有时,你需要在PDF中绘制不依 ...

  5. Integral Promotions整数提升和符号扩展(char,unsigned char,signed char)

    以下来自msdn: Objects of an integral type can be converted to another wider integral type (that is, a ty ...

  6. 9天快速入门java

    Java入门教程[9天快速入门JAVA] §1.3.简单的Java程序 下面我们先介绍两个简单的Java程序,并对其进行分析. 例1.1. public class HelloWorldApp{//a ...

  7. SSH-Struts(一)——基本原理

    简单介绍 Struts框架是MVC的一个实现,它非常好的结合了JSP.Servlet.JavaBean.Taglib等技术.它为MVC的各层提供了良好的支持,就像房地产商盖房子时先盖的大楼框架. 仅仅 ...

  8. android模拟器 一个错误:X Error of failed request: BadRequest (invalid request code or no such operation)

    最近ubuntu12.04学习python,python2.7 python3.2所不同的是还是蛮大的.学习思考的新 升级后 结果显示 输入方法不显示   update-manager 和  add- ...

  9. Netty In Action中文版 - 第五章:Buffers(缓冲)

    本章介绍 ByteBuf ByteBufHolder ByteBufAllocator 使用这些接口分配缓冲和运行操作 每当你须要数据传输时,它必须包括一个缓冲区.Java NIO API自带的缓冲区 ...

  10. Session 转台服务器的使用方法

    Session的缺陷:为了保持自身的稳定,IIS在访问量大的时候,可能会不自觉的重启,这时候Session就会丢失用户就会被迫下线 解决方案1:将Session放到一个专门的转台服务器上 方案2:将S ...