いいえ。 (私が考えることのできるものはありません。)
問題は、MySQLが更新を処理する方法です。 MySQL(UPDATE
を実装する他のDBMSとの違い 適切に)、壊れた方法で更新を処理します。 UNIQUE
のチェックを強制します (およびその他の)すべての行の更新後の制約であり、UPDATE
全体の後ではありません。 ステートメントが完了します。そのため、(ほとんどの)他のDBMSではこの問題は発生しません。
一部の更新(すべてまたは一部のIDの増加など、id=id+1
)、これは、別の非標準機能であるORDER BY
を使用して解決できます。 アップデートで。
2つの行の値を交換する場合、そのトリックは役に立ちません。 NULL
を使用する必要があります または、偽の値(存在しないが、列で許可されている)と2つまたは3つのステートメント。
一意の制約を一時的に削除することもできますが、それは実際には良い考えではないと思います。
したがって、一意の列が符号付き整数で負の値がない場合は、トランザクションでラップされた2つのステートメントを使用できます。
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 ;