一時的にユニーク制約を違反してしまう場合のベストプラクティス
JPAを使って開発しています。
対象DBは、SQL Server、Oracle、PostgreSQLのいずれでも動作可能な設計です。
(JPAを使っているので、実装上は特に区別しません)
あるマスタを保存するテーブルXに、ORDER
という列があります。
テーブルXのマスタを全て表示するときの並び順が入っています。
ただ、ORDER
の数値は重複させたくないので、ユニーク制約を設けています。
この並び順は、画面上でドラッグ&ドロップで入れ替えることができるのですが、登録するときには複数のレコードに対してORDER
列の数値を更新します。
この時、ユニーク制約の違反が発生してしまい、困っています。
例えば、
ID ORDER
A 1
B 2
C 3
これに対して、BとCを入れ替えるとします。
その場合のクエリは、何も考えずに作ると次のようになると思います。
※実際にはJPQLを使って実装しています。
(1) UPDATE X SET ORDER = 3 WHERE ID = 'B'
(2) UPDATE X SET ORDER = 2 WHERE ID = 'C'
しかしこれでは、(1)を実行すると、BもCもORDER
が3になってしまうので、ユニーク制約違反のエラーが発生します。
こういった要求は割とよくあると思うのですが、どのように解決するものなのでしょうか?