码迷,mamicode.com
首页 > 数据库 > 详细

mysql update改动多条数据

时间:2015-02-17 12:51:00      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:

通常情况下,我们会使用下面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改动多条数据

标签:

原文地址:http://www.cnblogs.com/bhlsheji/p/4295090.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!