(优化前)一般使用的批量更新的方法:
foreach
(
$display_order
as
$id
=>
$ordinal
) {
$sql
=
"UPDATE categories SET display_order = $ordinal WHERE id = $id"
;
mysql_query(
$sql
);
}
更新一条数据一个update语句,更新100条就100个update语句,就要commit100次;
(优化后)批量更新优化小技巧:使用的是case when的小技巧来实现批量更新的
1>.下面是批量更新多条数据,单个字段的语句
UPDATE
mytable
SET
myfield =
CASE
id
WHEN
1
THEN
'value1'
WHEN
2
THEN
'value2'
WHEN
3
THEN
'value3'
END
WHERE
id
IN
(1,2,3)
语句的意思:更新myfield 字段的值,若id为1,则myfield的值为value1;若id为2,则myfield的值为value2;若id为3,则myfield的值为value3,依次通过case when判断比较更新对应的值
2>.下面是批量更新多条数据,多个字段的语句
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)
使用case when这种小技巧来实现批量更新数据效率很高,相比使用foreach、for、while等等一些循环来实现批量更新,它一条update更新多条数据,只需要commit一次,而使用循环来批量更新的话就需要commit多次(取决于循环的次数)
注意:执行的sql语句长度受到my.ini配置文件中max_allowed_packet参数的限制,所以当您使用本文的方法批量更新多条数据,超出sql语句长度限制时,请适当的修改该参数
本文参考自:http://www.ghugo.com/update-multiple-rows-with-different-values-and-a-single-sql-query/