天天看點

MySQL批量更新資料

mysql更新語句很簡單,更新一條資料的某個字段,一般這樣寫:

如果更新同一字段為同一個值,mysql也很簡單,修改下​<code>​where​</code>​即可:

這裡注意,​<code>​other_values​</code>​是一個逗号​<code>​,​</code>​分隔的字元串,如:​<code>​1,2,3​</code>​

那如果更新多條資料為不同的值,可能很多人會這樣寫:

即是循環一條一條的更新記錄。

一條記錄​<code>​update​</code>​一次,這樣性能很差,也很容易造成阻塞。

那麼能不能一條sql語句實作批量更新呢?

mysql并沒有提供直接的方法來實作批量更新,但是可以用點小技巧來實作。

MySQL批量更新資料
MySQL批量更新資料

這裡使用了​<code>​case when​</code>​ 這個小技巧來實作批量更新。

舉個例子:

MySQL批量更新資料
MySQL批量更新資料

這句sql的意思是,更新​<code>​display_order​</code>​ 字段:

如果id=1

 則display_order

 的值為3

如果id=2

 則 display_order

 的值為4

如果id=3

 的值為5

即是将條件語句寫在了一起。

這裡的​<code>​where​</code>​部分不影響代碼的執行,但是會提高sql執行的效率。

確定sql語句僅執行需要修改的行數,這裡隻有​<code>​3​</code>​條資料進行更新,而​<code>​where​</code>​子句確定隻有​<code>​3​</code>​行資料執行。

如果更新多個值的話,隻需要稍加修改:

MySQL批量更新資料
MySQL批量更新資料

到這裡,已經完成一條mysql語句更新多條記錄了。

但是要在業務中運用,需要結合服務端語言。

在PHP中,我們把這個功能封裝成函數,以後直接調用。

為提高可用性,我們考慮處理更全面的情況。

如下時需要更新的資料,我們要根據​<code>​id​</code>​和​<code>​parent_id​</code>​字段更新​<code>​post​</code>​表的内容。

其中,​<code>​id​</code>​的值會變,​<code>​parent_id​</code>​的值一樣。

MySQL批量更新資料
MySQL批量更新資料

例如,我們想讓​<code>​parent_id​</code>​為​<code>​100​</code>​、​<code>​title​</code>​為​<code>​A​</code>​的記錄依據不同​<code>​id​</code>​批量更新:

其中,​<code>​batchUpdate()​</code>​實作的PHP代碼如下:

MySQL批量更新資料
MySQL批量更新資料

得到這樣一個批量更新的SQL語句:

MySQL批量更新資料
MySQL批量更新資料

生成的SQL把所有的情況都列了出來。

不過因為有​<code>​WHERE​</code>​限定了條件,是以隻有​<code>​id​</code>​為​<code>​1​</code>​、​<code>​2​</code>​、​<code>​3​</code>​這幾條記錄被更新。

如果隻需要更新某一列,其他條件不限,那麼傳入的​<code>​$data​</code>​可以更簡單:

這樣的資料格式傳入,就可以修改​<code>​id​</code>​從​<code>​1~3​</code>​的記錄,将​<code>​sort​</code>​分别改為​<code>​1、3、5​</code>​。

得到SQL語句:

MySQL批量更新資料
MySQL批量更新資料

這種情況更加簡單高效。