mysql update改动多条数据
通常情况下,我们会使用下面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改动多条数据的更多相关文章
- mysql查询随机几条数据(速度快)
MySql查询随机几条数据 想到了 Max RAND 这几个函数 用以下2种办法都可以实现查询. 速度还行. 几十万数据左右, 没有什么问题. SELECT * FROM `news` WHERE i ...
- 复杂业务下向Mysql导入30万条数据代码优化的踩坑记录
从毕业到现在第一次接触到超过30万条数据导入MySQL的场景(有点low),就是在顺丰公司接入我司EMM产品时需要将AD中的员工数据导入MySQL中,因此楼主负责的模块connector就派上了用场. ...
- 关于如何在mysql中插入一条数据后,返回这条数据的id
简单的总结一下如何在mysql中出入一条数据后,返回该条数据的id ,假如之后代码需要这个id,这样做起来就变得非常方便,内容如下: <insert id="insertAndGetI ...
- 教你如何6秒钟往MySQL插入100万条数据!然后删库跑路!
教你如何6秒钟往MySQL插入100万条数据!然后删库跑路! 由于我用的mysql 8版本,所以增加了Timezone,然后就可以了 前提是要自己建好库和表. 数据库test, 表user, 三个字段 ...
- Java 线程池 +生产者消费者+MySQL读取300 万条数据
1.1需求 数据库300 万条用户数据 ,遍历获取所有用户, 各种组合关联, 获取到一个新的json ,存到redis 上. 1.2 难点 数据库比较多, 不可能单线程查询所有的数据到内存. 1.3解 ...
- mysql 中实现多条数据同时更新
有时间我们需要对一张表进行批量数据的更新.首先我们想的是update 语句. 比如对一张订单表order_info 多条数据更新, update order_inifo set order_cod ...
- mysql,给每一条数据的某一个字段生成不同的随机数
UPDATE t_article ta-- 利用LEFT JOIN的方式进行关联修改 LEFT JOIN(-- 先通过查询的方式给每一条数据生成对应的10-500之间随机数 SELECT articl ...
- 【sql】mysql数据库做两条数据替换的操作,不使用第三方变量
需求: 1.将数据库中两条数据中的唯一约束列 做值的替换 原始思想: 将两条数据查出来,在程序中设置第三方变量,进行两条数据的替换,然后将原始两条数据删除,将新的两条替换后的数据插入. 新思想: 1 ...
- 用一条mysql语句插入多条数据
这篇文章主要介绍了在mysql中使用一条sql语句插入多条数据,效率非常高,但是原理其实很简单,希望对大家有所帮助 假如有一个数据表A: id name title addtime 如果需要插入n条数 ...
随机推荐
- 安卓开发-Activity中finish() onDestroy() 和System.exit()的区别
Activity.finish()Call this when your activity is done and should be closed. 在你的activity动作完成的时候,或者Act ...
- C#如何在panl控件上添加Form窗体
. if (treeView1.SelectedNode.Text == "个人信息") { Form1 f4 = new Form1(); f4.TopLevel = false ...
- (解决tomcat端口被占用的问题)create[8005]java.net.BindException: Address already in use: JVM_Bind
create[8005]java.net.BindException: Address already in use: JVM_Bind”,原来是Tomcat8005端口被其他进程占用,8005端口是 ...
- CentOS6.5安全策略设置
应公司内部网站等级测评的需求,正逐渐加强系统安全防护 密码策略设置 检查方法: 使用命令 #cat /etc/login.defs|grep PASS查看密码策略设置 备份方法: cp -p /etc ...
- Android学习笔记:Activity生命周期详解
进行android的开发,必须深入了解Activity的生命周期.而对这个讲述最权威.最好的莫过于google的开发文档了. 本文的讲述主要是对 http://developer.android.co ...
- Tinyfool的2013年总结————在困惑和挣扎中试图前行
Tinyfool的2013年总结----在困惑和挣扎中试图前行 | Tinyfool的Blog Tinyfool的2013年总结----在困惑和挣扎中试图前行
- PE文件简单介绍
PE(Portable Execute)文件是WIN32下可运行文件遵循的数据格式,也是反汇编调试不可缺少的文件,常见的pe文件有.exe和.dll文件.本文主要介绍pe文件的结构和虚拟内存地址转换到 ...
- Ubuntu14.04更新源
Ubuntu14.04更新源 http://jingyan.baidu.com/article/7f41ecec1b7a2e593d095ce6.html Ubuntu源 http://wiki.ub ...
- 使用ItextSharp产PDF完整操作
原文 使用ItextSharp产PDF完整操作 记得上回有写到用C#操作Excel(.net 4.0) 很多朋友说推荐用NPOI,的确,用微软自带的操作execl会有很大的问题.客户的主机不愿意安装e ...
- [置顶] DX报表的开发流程(1)
DevExpress.XtraReports简称为DX报表. 本文主要介绍下VS2010项目中如何开发DX报表,具体的内容包括: (1)下载安装 (2)报表文件创建 (3)页面文件的创建 (4)页面的 ...