ホームページ >データベース >mysql チュートリアル >一意の制約を尊重しながら MySQL で行の値を交換するにはどうすればよいですか?

一意の制約を尊重しながら MySQL で行の値を交換するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-26 14:42:02709ブラウズ

How to Swap Row Values in MySQL While Respecting Unique Constraints?

一意の制約に違反せずに 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 サイトの他の関連記事を参照してください。

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