次の単純なテーブル構造(SQL Server 2008)を考えると、数列列の一意性を維持できるようにしたいのですが、特定のレコードのその値を更新できるようにしたいのです。
CREATE TABLE MYLIST(
ID int NOT NULL IDENTITY(1, 1)
, TITLE varchar(50) NOT NULL
, SEQUENCE int NOT NULL
, CONSTRAINT pk_mylist_id PRIMARY KEY(ID)
, CONSTRAINT uq_mylist_sequence UNIQUE(SEQUENCE)
);
私のインターフェースでは、アイテムの順序を混乱させることができ、更新を実行する前に、どの非重複シーケンスにすべてを含めるべきかがわかりますが、一意の制約の違反に直面することなく更新を実行するにはどうすればよいですか?
たとえば、次のレコードがあるとします。
ID TITLE SEQUENCE
1 APPLE 1
2 BANANA 2
3 CHERRY 3
そして、それらのシーケンス番号を次のように更新したいと思います。
ID TITLE SEQUENCE
1 APPLE 3
2 BANANA 1
3 CHERRY 2
しかし、実際には、数十のアイテムを扱うことができました。シーケンス番号は重複してはなりません。トリガーを使用したり、制約を一時的に無効にしたりすることを考えましたが、それではさらに問題が発生するようです。私はC#とLINQ-to-SQLを使用していますが、厳密にデータベースソリューションを利用できます。