ホームページ >データベース >mysql チュートリアル >一意の制約を尊重しながら MySQL で行の値を交換するにはどうすればよいですか?
一意の制約に違反せずに MySQL で行の値を交換する
MySQL では、テーブル内の 2 つの行の値を交換することが必要になることがよくあります。特定の列に対する一意の制約を維持しながら。ただし、CASE 句を指定した一般的な UPDATE ステートメントを使用すると、一意制約に違反すると重複エントリ エラーが発生する可能性があります。
問題
この問題は、MySQL が原因で発生します。プロセスは行ごとに更新し、変更のたびに一意制約違反をチェックします。提供された例では:
UPDATE tasks SET priority = CASE WHEN priority=2 THEN 3 WHEN priority=3 THEN 2 END WHERE priority IN (2,3);
MySQL は、優先度 2 の最初の行を優先度 3 に更新します。ただし、優先度 3 の 2 番目の行を優先度 2 に更新しようとすると、すでに 3 であるため、違反が発生します。
解決策
残念ながら、偽の値や複数のクエリを使用せずに MySQL で行値の交換を行うことはできません。これは、MySQL の固有の制約処理動作によるものです。
この制限を回避するには、トランザクションにラップされた次の 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 は更新を 1 つの操作として考慮し、一意制約違反を防ぎます。
以上が一意の制約を尊重しながら MySQL で行の値を交換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。