如何在不違反完整性的情況下使用唯一約束交換 MySQL 中的行值?

Linda Hamilton
發布: 2024-10-26 00:23:28
原創
151 人瀏覽過

How to Swap Row Values in MySQL with a Unique Constraint Without Violating Integrity?

在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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!