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

MySQL で一意の制約を使用して行の値を交換するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-26 04:23:31316ブラウズ

 How to Swap Row Values in MySQL with a Unique Constraint?

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 では各行の更新後に制約チェックが強制されるためです。

代替アプローチ:

制約に違反せずに値を交換するには、トランザクション内の次の手順:

  1. 偽の値で行を更新: 1 つの行の優先順位を存在しない負の値 (-2) に設定し、もう 1 つの行を別の負の値 (-3)。
  2. 負の値を使用して値を交換します: 偽の値 (-priority) を無効にして優先順位を交換します。
  3. コミットトランザクション: 変更を永続的に適用します。

トランザクション ステートメント:

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 サイトの他の関連記事を参照してください。

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