4

次の単純なテーブル構造(SQL Server 2008)を使用すると、数値シーケンス列の一意性を維持できるようにしたいが、任意のレコードに対してその値を更新できるようにしたいs)。一意の制約を使用してデータベースレコードを更新する

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を使用していますが、厳密にデータベースソリューションを公開しています。

+0

1つのステートメントで更新できますか? – gbn

+0

あなたの質問に答えることができれば、私は何でも自由に試すことができます。 – JustinStolle

答えて

2

あなたはそれらに彼らの正しい値のを割り当てることができ、その後、すべての更新が発生した後、あなたがSEQUENCE = -SEQUENCEを設定し、最終的な更新を行います。

これはではありません。非常に効率的ですが、あなたは数十アイテムしか持っていないと言われているので、その影響は目に見えます。一時的に誤って割り当てられた値を示すために、マイナスの数値を「マジック値」として使用できると仮定しています。

+0

私はこの単純さが好きで、質問を投稿してから数分後に自分自身で実際に考えました。私の状況では、これは最も理にかなっているかもしれません。 – JustinStolle

+0

ええええええええええええええええええええええええええええええんえんかんこんが負の数値を直接データベースに入力するのを止めるものは何もありません。 –

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 
+0

これは、エラーの可能性が最も低い技術的に正しい解決策ですが、追加のコードが必要になります。私の目的のために、Daveの負の数のトリックで十分です。 – JustinStolle

0

正しい順序を知らずに挿入するワークフローに従わなければならない場合、正しい順序を設定するために後で更新プログラムに戻ってくる必要がある場合は、一意の制約を取り除くことをお勧めしますそれは価値があるより多くの問題を引き起こしているからです。もちろん、その固有の制約がアプリケーションにとってどれほど価値があるかを知っているだけです。

+0

私は、更新する前に正しい/希望の注文を事前に知っています。 – JustinStolle

+0

正しいですが、挿入の前に正しい順序がわからない、そうですか? –

+0

私は、現在のシーケンスと、すべてのレコードの新しいシーケンスを知っています。私は更新についてのみ質問して、挿入はしません。しかし、私は不思議なことですが、あなたの価値観は一度しか書けず、決して変更することのできないユニークな制約の解釈ですか? – JustinStolle

関連する問題