• mysql:批量更新


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

    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/
      
     
  • 相关阅读:
    HDU1213How Many Tables并查集
    Redis新的存储模式diskstore
    GPFS文件系统笔记
    redis持久化
    360安全卫士qurl.f.360.cn分析
    [原创]解决DataSet的GetXml()方法空列不返回问题
    在多台服务器上简单实现Redis的数据主从复制
    史航416随笔
    史航416实验1总结
    史航416第二次作业总结
  • 原文地址:https://www.cnblogs.com/zengguowang/p/5466051.html
Copyright © 2020-2023  润新知