如何在数据库中一次更新多行多字段

数据库操作中经常会遇到需要更新多个行、多个字段的操作,这里介绍一种结构清晰的SQL语句,以期能提高数据库操作效率,并尽可能降低系统资源的消耗。

我们先看一个常见的SQL UPDATE语句的写法:

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

在更新多行操作,常见的SQL UPDATE写法可能如下所示(PHP环境下):

foreach ($display_order   as $id => $ordinal) {
$sql = "UPDATE categories SET display_order = $ordinal   WHERE id = $id";
mysql_query($sql);
}

上述代码虽然也能达到我们期待的结果,但很显然,上述代码多次执行数据库更新(UPDATE)操作,当更新行数较多时,将严重占用系统资源。

改进后的数据库更新(UPDATE)操作

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)

经过改进后的上述代码也能实现更新多行的目标,而且更新操作是在一条更新语句中完成,大大降低了数据库更新操作占用的系统资源。

代码说明:

SET myfield = CASE other_field – 使用CASE语句代替具体的字段值。
WHEN 1 THEN ‘value’ – 根据条件(在本例中的判断条件就是id)更新对应的字段.
WHERE id IN (1,2,3) – 指定查询范围,可省略(不推荐) 。

示例

UPDATE categories
SET display_order =   CASE id
 WHEN 1 THEN 3
 WHEN 2 THEN 4
 WHEN 3 THEN 5
END
 WHERE id IN (1,2,3)

更新多行多字段的SQL UPDATE语句,只要相应的增加CASE语句即可。


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, 按键值的方式给数组初始化(category ids 作为键 ,赋予新的次序)
 $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 .= "END WHERE id IN ($ids)";
 echo $sql;

运用上述方法,在更新成千上万行的数据时,将大大提高数据库操作效率,并降低系统资源消耗。

标签:
除非注明,本博客文章均为原创,转载请以链接形式标明本文地址
原创文章如转载,请注明:转载自 任鸟飞网页设计 [ http://www.renniaofei.com/ ]
本文链接地址: http://www.renniaofei.com/code/update-multiple-rows-with-different-values-and-a-single-sql-query/
引用通告地址 Trackback URL:直接在本文链接地址后添加 trackback/
本文短网址: http://bit.ly/azf5Oy
任鸟飞

任鸟飞网页设计网创办者 主要关注网页设计,网站建设,图形图像设计。 Twitter @renniaofei QQ:29900684

1 条评论

  1. Industryidea 三月 13th, 2010   10:56 上午

    很实用,先收藏了。

留下评论

:wink: :-| :-x :twisted: :) 8-O :( :roll: :-P :oops: :-o :mrgreen: :lol: :idea: :-D :evil: :cry: 8) :arrow: :-? :?: :!: