ホームページ  >  記事  >  データベース  >  整合性を損なうことなく、一意の制約を使用して MySQL の行の値を交換するにはどうすればよいですか?

整合性を損なうことなく、一意の制約を使用して MySQL の行の値を交換するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-26 00:23:28152ブラウズ

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

一意の制約を維持しながら MySQL で行の値を交換する

MySQL では、テーブル内の 2 つの行の間で優先順位の値を交換するタスク。一意制約では、制約違反によりエラーが発生する可能性があります。この問題を理解するために、一般的な 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 の中間値 (偽または null) または複数のクエリ。一意性制約は各行更新後に一意性を強制するため、直接のスワップは不可能になります。

一時的な制約の削除

1 つのオプションは、一意性制約を一時的に削除し、スワップ操作を実行することです。をクリックしてから、制約を再度追加します。ただし、このアプローチはデータの整合性が損なわれるため推奨されません。

偽の値と複数のクエリ

推奨されるアプローチには、一時的に偽の値 (-3) を使用することが含まれます。最初の行の優先順位の値を保持し、それを 2 番目の行の値と交換します。トランザクション内で 2 つのクエリが必要です:

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。