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