首頁  >  文章  >  資料庫  >  如何在具有唯一約束的 MySQL 中交換行優先權值?

如何在具有唯一約束的 MySQL 中交換行優先權值?

Susan Sarandon
Susan Sarandon原創
2024-10-26 16:40:02769瀏覽

How to Swap Row Priority Values in MySQL with a Unique Constraint?

在MySQL 中交換具有唯一約束的行的值

問題:

問題:

你怎麼能在不違反表格對優先權列的唯一約束的情況下交換MySQL 中兩行的優先權值?

背景:

任務表有一個具有唯一優先權列約束,表示每一行在該列中可以有唯一的值。更新行時,MySQL 在每次更新後都會檢查唯一約束違規,這會阻止直接交換值。

解決方案:

不幸的是,不可能交換直接在MySQL 中讀取行,而不會違反唯一約束或使用虛假值和多個查詢。這是由於 MySQL 處理更新的不尋常方式,它在每​​個更新後而不是更新語句完成後強制執行唯一性檢查。 雖然可以使用 ORDER BY 等技巧解決其他 DBMS 的類似問題,此技術不適用於交換值。

替代方案:
  1. 可以考慮兩種替代方法:
  2. NULL或虛假值:使用NULL值或列中不存在的虛假值。這就需要使用多個查詢來完成交換。

暫時約束移除:暫時移除唯一約束,執行交換,然後重新新增約束。這不是建議的方法,因為它可能會導致資料完整性問題。

範例(有符號整數且無負值):
<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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn