MySQL批量更新數據的六種方法,你能想出第七種嗎?
我們都知道MYSQL中批量插入非常簡單,那么批量更新呢?
1.IN
IN 語句有比較大的局限性,更新后的結果必須一致。比如下面是將所有滿足條件的行的狀態(status)設置為1。
如果想部分設置為1,部分設置為2等,則無法實現,或者通過寫多條SQL語句實現。
2. For + Update
借助 For 循環 + Update 語句,即逐一更新,優點是清晰直觀,適用于大部分情況,不易出錯。缺點是性能較差,容易造成堵塞。
如果是在MYSQL客戶端執行,這種方法很不方便。一般需要生成多條Update語句,或者可以用存儲過程實現。
3. Insert into…on duplicate key update
利用主鍵(或唯一鍵)的唯一性進行更新的好處是支持批量更新,更新結果不需要保持一致。缺點是一般第三方庫不支持這種語法,需要寫原生SQL,所有字段必須有默認值(包括NULL)。
4. Replace into
眾所周知,它是一個替換,相當于一個 update。語法類似于第三種方法,但比第三種方法更危險,因為更新時如果字段不完整,未覆蓋的字段將被設置為默認值。
原因是 replace into 操作的本質是先刪除重復記錄再插入,所以如果更新的字段不完整,缺失的字段會被設置為默認值,而 insert into 只是更新重復記錄,不會改變其他字段。
5. Set…case…when…where
- 優點:可以批量更新,也支持更新多個字段,更新多個結果。
- 缺點:語句較長,實現起來比較麻煩,也比較容易出錯。
通常它是通過主鍵或唯一鍵更新的。
一般這種方式也比較容易出錯,主要有兩種:
通過上面的測試,我們可以看出這種操作方式是相當危險的。一不小心,字段就會更新為默認值,所以使用的時候一定要非常小心,一定不能漏掉Where子句。
6.創建臨時表
臨時表的方式是替換另一個表的數據,但是一般情況下我們是沒有創建表的權限的,所以這個想法可能不太現實。