ホームページ >データベース >mysql チュートリアル >MySQL で一意の制約を使用して行の値を交換するにはどうすればよいですか?
MySQL の一意制約による行の値の交換
MySQL では、優先度カラムの一意制約を使用して 2 つの行の優先度値を交換できます。課題です。
問題:
このステートメントを使用して値を交換すると、
UPDATE tasks SET priority = CASE WHEN priority=2 THEN 3 WHEN priority=3 THEN 2 END WHERE priority IN (2,3);
の重複エントリ違反によりエラーが発生します。
解決策:
残念ながら、MySQL では複数のクエリや偽の値を使用せずに値を交換することはできません。これは、他の DBMS とは異なり、MySQL では各行の更新後に制約チェックが強制されるためです。
代替アプローチ:
制約に違反せずに値を交換するには、トランザクション内の次の手順:
トランザクション ステートメント:
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 サイトの他の関連記事を参照してください。