如何在MySQL的SQL語句中避免數據唯一性衝突

MySQL在修改完每一行數據後都驗證數據約束,而不是像SQL標準裏執行完整條語句才驗證。這樣做帶來的一個問題就是,如果一條SQL語句會改動多行數據,即使改動過程中違反了數據約束但改動後並不違反數據約束,也會被MySQ判爲違反數據約束從而執行失敗。

舉例來說:

這個問題我沒有找到完美的解決方法。但有幾個在特定情況下有效的解法:
1)暫時刪除相關約束,改動完數據後再加回去
2)在update語句中使用order by子句控制行改動次序,保證在任一行改動後都不違法約束。這個方法侷限性比較大,有時我們是想交換兩個不相鄰行的值
3)使用一個臨時值做中轉(如一個沒有被其它任何行使用的值,有些情況下NULL是一個不錯的選擇)。類似於程序設計中典型的交換兩個變量值的方法
4)重新設計應用邏輯,儘量避免一次更改多行的情況出現

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章