ホームページ  >  記事  >  データベース  >  一意の制約違反をせずに MySQL で値を交換するにはどうすればよいですか?

一意の制約違反をせずに MySQL で値を交換するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-26 05:07:31251ブラウズ

How to Swap Values in MySQL without Unique Constraint Violations?

一意制約違反なしで MySQL で値を交換する

MySQL では、一意制約が適用されている場合、2 つの行間の値を交換するのが困難になることがあります。影響を受ける列。この問題は、MySQL がステートメント全体の完了ではなく、各行の更新後に制約チェックを強制するために発生します。

この制限に対処するには、次の解決策を検討してください。

<code class="sql">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 ;</code>

この解決策では、両方の更新がアトミックに実行されることを保証するためにトランザクションが開始されます。一意性制約との競合を避けるために、優先順位には一時的に負の値が割り当てられます。その後、別の更新によって負の値が元の優先順位に割り当てられ、それらの値が事実上交換されます。

または、優先順位列で負の値が許可されない場合は、一時変数を使用するか、一時テーブルを作成して、優先順位を保持することができます。交換された値。ただし、これらの方法には複数のクエリが含まれる場合があります。

データの整合性が損なわれる可能性があるため、一意制約を一時的に削除することはお勧めできません。

以上が一意の制約違反をせずに MySQL で値を交換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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