在MySQL 中交換具有唯一約束的行的值
問題:
問題:你怎麼能在不違反表格對優先權列的唯一約束的情況下交換MySQL 中兩行的優先權值?
背景:任務表有一個具有唯一優先權列約束,表示每一行在該列中可以有唯一的值。更新行時,MySQL 在每次更新後都會檢查唯一約束違規,這會阻止直接交換值。
解決方案:不幸的是,不可能交換直接在MySQL 中讀取行,而不會違反唯一約束或使用虛假值和多個查詢。這是由於 MySQL 處理更新的不尋常方式,它在每個更新後而不是更新語句完成後強制執行唯一性檢查。 雖然可以使用 ORDER BY 等技巧解決其他 DBMS 的類似問題,此技術不適用於交換值。
替代方案:暫時約束移除:暫時移除唯一約束,執行交換,然後重新新增約束。這不是建議的方法,因為它可能會導致資料完整性問題。
範例(有符號整數且無負值):<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中文網其他相關文章!