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

MySQL で行優先度の値を一意の制約と交換するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-26 16:40:02854ブラウズ

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

MySQL で一意の制約を持つ行の値を交換する

質問:

どうすればよいですか優先度列に対するテーブルの一意の制約に違反せずに、MySQL の 2 つの行の優先度値を交換しますか?

背景:

タスク テーブルには、一意の優先度を持つ優先度列があります。制約。つまり、各行はその列内で一意の値を持つことができます。行を更新するとき、MySQL は更新のたびに一意制約違反をチェックします。これにより、値を直接交換することができなくなります。

解決策:

残念ながら、次の値を交換することはできません。一意制約に違反したり、偽の値や複数のクエリを使用したりすることなく、MySQL で直接行を取得できます。これは、更新ステートメントの完了後ではなく、各行の更新後に一意性チェックを強制する MySQL の更新処理の珍しい方法によるものです。

ORDER BY などのトリックを使用すると、他の DBMS でも同様の問題を解決できる可能性があります。 、この手法は値の交換には機能しません。

代替案:

2 つの代替アプローチが検討できます:

  1. NULLまたは偽の値: NULL 値または列に存在しない偽の値を使用します。スワップを完了するには、複数のクエリを使用する必要があります。
  2. 一時的な制約の削除: 一意の制約を一時的に削除し、スワップを実行して、制約を再度追加します。これは、データの整合性の問題が発生する可能性があるため、推奨されるアプローチではありません。

例 (符号付き整数および負の値なし):

優先度列の場合が負の値を含まない符号付き整数である場合は、トランザクションでラップされた次のクエリを使用できます:

<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 までご連絡ください。