ホームページ >データベース >mysql チュートリアル >MySQL で行優先度の値を一意の制約と交換するにはどうすればよいですか?
MySQL で一意の制約を持つ行の値を交換する
質問:
どうすればよいですか優先度列に対するテーブルの一意の制約に違反せずに、MySQL の 2 つの行の優先度値を交換しますか?
背景:
タスク テーブルには、一意の優先度を持つ優先度列があります。制約。つまり、各行はその列内で一意の値を持つことができます。行を更新するとき、MySQL は更新のたびに一意制約違反をチェックします。これにより、値を直接交換することができなくなります。
解決策:
残念ながら、次の値を交換することはできません。一意制約に違反したり、偽の値や複数のクエリを使用したりすることなく、MySQL で直接行を取得できます。これは、更新ステートメントの完了後ではなく、各行の更新後に一意性チェックを強制する MySQL の更新処理の珍しい方法によるものです。
ORDER BY などのトリックを使用すると、他の DBMS でも同様の問題を解決できる可能性があります。 、この手法は値の交換には機能しません。
代替案:
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 サイトの他の関連記事を参照してください。