在MySQL 中交換行值,同時保留唯一限制
在MySQL 中,在表格中的兩行之間交換優先權值的任務唯一約束可能會因違反約束而遇到錯誤。為了理解這個問題,讓我們檢查一個典型的UPDATE 語句:
UPDATE tasks SET priority = CASE WHEN priority=2 THEN 3 WHEN priority=3 THEN 2 END WHERE priority IN (2,3);
但是,此語句會導致錯誤:
Error Code: 1062. Duplicate entry '3' for key 'priority_UNIQUE'
問題的性質
MySQL 處理更新的方式與其他DBMS 不同。它在每行更新後(而不是在整個語句完成後)檢查約束違規。因此,交換值直接違反了唯一限制。
沒有虛假值或多個查詢的替代方案
不幸的是,如果不使用MySQL 中的中間值(偽造或空白)或多個查詢。唯一約束在每行更新後強制執行唯一性,使得直接交換不可能。
臨時約束刪除
一種選擇是暫時刪除唯一約束,執行交換操作,然後重新新增約束。但是,不建議使用這種方法,因為它會損害資料完整性。
虛假值和多個查詢
建議的方法包括使用虛假值(-3) 暫時保存第一行的優先值並將其與第二行的值交換。事務中需要兩個查詢:
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 ;
此程序確保在交換操作期間不違反約束。
以上是如何在不違反完整性的情況下使用唯一約束交換 MySQL 中的行值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!