在MySQL 中交換值而不違反唯一約束
在MySQL 中,當應用唯一約束時,在兩行之間交換值可能會很困難受影響的列。出現此問題的原因是 MySQL 在每行更新後強制執行約束檢查,而不是在整個語句完成後進行約束檢查。
要解決此限制,請考慮以下解決方案:
<code class="sql">START TRANSACTION ; UPDATE tasks SET priority = CASE WHEN priority = 2 THEN -3 WHEN priority = 3 THEN -2 END WHERE priority IN (2,3) ; UPDATE tasks SET priority = - priority WHERE priority IN (-2,-3) ; COMMIT ;</code>
在此解決方案中,啟動事務以確保兩個更新都以原子方式執行。負值被暫時分配給優先權以避免與唯一約束發生衝突。隨後,另一個更新將負值分配給原始優先級,從而有效地交換它們的值。
或者,如果優先權列中不允許負值,您可以使用臨時變數或建立臨時表來保存交換了值。但是,這些方法可能涉及多個查詢。
需要注意的是,不建議暫時刪除唯一約束,因為它可能會損害資料完整性。
以上是如何在不違反唯一約束的情況下交換 MySQL 中的值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!