1. <em id="g3zke"><tr id="g3zke"></tr></em>
    2. <dd id="g3zke"></dd>
          1. 當前位置:首頁 » 程序代碼 » 正文

                  如果是要把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.nyyv.tw/mysql-updateall.html
            本文作者:火端,轉載請務必以超鏈接形式注明出處。
            本文標簽:Mysql
             關鍵詞: Mysql批量更新  
            發表評論

            昵稱 (必填)

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

            網址 (選填)

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

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

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

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

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

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

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

            站內搜索

            江苏快3开奖结果今天