<rp id="hvkob"></rp>

    <td id="hvkob"></td>

    1. <li id="hvkob"></li>

      <dfn id="hvkob"><address id="hvkob"></address></dfn>
    2. <i id="hvkob"><optgroup id="hvkob"></optgroup></i>

    3. 當前位置:首頁 » 程序代碼 » 正文

            如果是要把Mysql多條數據的某個字段改成一樣的值,那語句非常簡單,例如把user表的部分用戶狀態改成 1,語句如下:

      UPDATE user SET status=1 WHERE id in ('1001,1002,1003');
            那如果要把多條user記錄的備注字段改成不同的值,一般情況是使用foreach循環修改。我看了Yii2和ThinkPHP5框架的源碼,均沒有真正批量更新不同值的方法,ThinkPHP也是采用foreach的形式,然后啟用事務機制,當某一條數據更新失敗就回滾。例如ThinkPHP5的saveAll批量更新操作就是使用如下代碼:


             這種方案當同時更新大量數據的時候很多問題就來了,比如處理時間過長,甚至超時,如果數據庫不支持事務機制,還會導致數據無法回滾,最終導致數據錯亂。難道就沒有一種像批量插入數據的語句來批量更新數據么?答案是有的!

             我們采用Mysql的WHEN  THEN 來判斷做處理,現在需要把多個user表的記錄里的備注改成不同的值,語句如下:

      UPDATE user
          SET remark = CASE id
              WHEN 1001 THEN '是小明介紹來的'
              WHEN 1002 THEN '比較有錢'
              WHEN 1003 THEN '這個客戶來自火端官網'
          END
      WHERE id IN (1001,1002,1003)
             沒錯,這樣可以一次性修改了多條記錄的不同值,如果我們想修改備注字段的同時,還想把其他字段修改為不同的值,可以這樣:

      UPDATE user
          SET remark = CASE id
              WHEN 1001 THEN '是小明介紹來的'
              WHEN 1002 THEN '比較有錢'
              WHEN 1003 THEN '這個客戶來自火端官網'
          END,
          realname = CASE id
              WHEN 1001 THEN '田馥甄'
              WHEN 1002 THEN '陳嘉樺'
              WHEN 1003 THEN '任家萱'
          END
      WHERE id IN (1001,1002,1003)
            如果要修改大量數據,就需要用動態語言把SQL語句循環組裝一下,生成的語句會比較長,別以為這樣會很麻煩,此方法批量更新會快很多倍。火端喜歡用數據說話,此類比較都會親自測試對比,火端嘗試使用foreach循環修改1000條數據,測試多次,平均耗時2.8秒,而采用此方法一次性批量更新,僅僅花了0.06秒!區別非常大,使用該方法批量更新是非常劃算的。

             如果需要使用它,建議大家自己封裝一個方法,也可以做參數綁定,防止SQL注入,以后批量更新不同記錄的不同字段,就用它吧!

      本文地址:http://www.ikmqq.com/mysql-updateall.html
      本文作者:火端,轉載請務必以超鏈接形式注明出處。
      本文標簽:Mysql
       關鍵詞: Mysql批量更新  
      發表評論

      昵稱 (必填)

      郵箱 (選填,可收到作者回復信息)

      網址 (選填)

      • 邱小彬
        邱小彬 2017年05月17日 回復

        測試OK,果然速度快,感謝火端提醒,以前我也都是foreach

      • 火端網絡 2017年05月17日 回復

      • 北京SEO
        北京SEO 2017年05月10日 回復

        碉堡了!一直以為ThinkPHP是一次性批量更新,原來也是foreach,有空我試下樓主的方法

      • 火端網絡 2017年05月10日 回復

        效率會高很多,不過需要點技術去封裝一下哦

      站內搜索

      安徽25选5现场