(优化前)一般使用的批量更新的方法:

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语句长度限制时,请适当的修改该参数