ホームページ >データベース >mysql チュートリアル >整合性を損なうことなく、一意の制約を使用して MySQL の行の値を交換するにはどうすればよいですか?
一意の制約を維持しながら 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 サイトの他の関連記事を参照してください。