3

次の単純なテーブル構造(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を使用していますが、厳密にデータベースソリューションを利用できます。

4

3 に答える 3

3

明らかな方法は、1つのバッチとして書き込むことです。内部的には、SQLは制約チェックを延期するため、中間の一意性は関係ありません。

行ごとに書くことは意味がなく、あなたが抱えている問題を引き起こします。

これを変更して一時テーブルに書き込み、最後に結果を「フラッシュ」することができます。最初に一時テーブルの一意性を確認することもできます。

DECLARE @NewSeq TABLE (ID int, NewSeq int)

INSERT @NewSeq (ID, NewSeq) VALUES (1, 3)
INSERT @NewSeq (ID, NewSeq) VALUES (2, 1)
INSERT @NewSeq (ID, NewSeq) VALUES (3, 2)

UPDATE
   M
SET
   SEQUENCE = NewSeq
FROM
   MYLIST M
   JOIN
   @NewSeq N ON M.ID = N.ID
于 2011-01-25T20:19:31.677 に答える
2

それらに正しい値の負の値を割り当て、すべての更新が行われた後、設定した場所で最終更新を行うことができますSEQUENCE = -SEQUENCE

あまり効率的ではありませんが、アイテムが数十個しかないということなので、その影響が目立つとは思えません。また、一時的に誤って割り当てられた値を示すために、「マジック値」として負の数を使用できると想定しています。

于 2011-01-25T20:23:34.953 に答える
0

正しい順序を知らずに挿入し、後で正しい順序を設定するために更新を返す必要があるというワークフローに本当に従わなければならない場合、それが原因であるため、一意の制約を取り除くことが最善の選択肢だと思いますあなたはそれが価値があるより多くの問題を抱えています。もちろん、その固有の制約がアプリケーションにとってどれだけ「価値がある」かを知っているのはあなただけです。

于 2011-01-25T20:36:17.290 に答える