質問: 'C' ``` しかしこれでは、(1)を実行すると、BもCも`ORDER`が3になってしまうので、ユニーク制約違反のエラーが発生します。 こういった要求は割とよくあると思うのですが、どのように解決するものなのでしょうか?
回答: 一つの考えですが、ユニーク制約の場合はNULLを持つこと許容します。NOT NULL制約がないなら (1) UPDATE X SET ORDER = NULL WHERE ID = 'B' (2) UPDATE X SET ORDER = 2 WHERE ID = 'C' (3) UPDATE X SET ORDER = 3 WHERE ID = 'B' で対応できるかもしれません。 ユニーク制約の削除・再作成、無効化・有効化だとUNIQUE INDEXの作り直しになるのである程度の負荷が予想されます。それは避けられるかと。 今回の場合は2行についてDELETE、INSERTでもいいかもしれません。 IDにインデックスがなければそのほうが手間もシステム負荷も少ないと思います。 一方でIDにインデックスがあるような場合はメンテナンスコストが少なくすむ可能性はあるのではないかと思います。 ご参考になれば。