代码改变世界

mysql:批量更新

2016-05-06 16:12  ZengGW  阅读(803)  评论(0编辑  收藏  举报

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

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/