2013-07-03 1 views
7

SQLでINSERTの値が重複しないようにするには?私は名前の一つのテーブルき

Delegates 

この表は、4つのフィールドがあります。

ID(Auto increment, Primary) 
MemberNo, FromYr, ToYr 

を私はこのクエリを挿入しています:

INSERT INTO Delegates ([MemNo],[FromYr],[ToYr]) values(@MemNo, @FromYr,@ToYr) 

値は、ユーザの入力から来ています。 1人のメンバーは何年にもわたって代議員になれるので、彼らは自分が望むように入力できるようになります。しかし、今問題は、同じ年に2人以上のメンバーを間違って挿入することができるということです。 ここで私は何ができますか?

+0

自然な固有キーは何ですか? IDENTITY値ではありません – gbn

+0

実際には固有のキーはありません。 – barsan

+2

ユニークなキーを最初に追加してください –

答えて

4

同じ値を持つレコードがある場合は、チェックを挿入する前に:

if not exists (select * from Delegates d where d.FromYr = @FromYr and d.MemNo = @MemNo) 
    INSERT INTO Delegates ([MemNo],[FromYr],[ToYr]) values(@MemNo, @FromYr,@ToYr) 
+3

これは高負荷では失敗します – gbn

+0

それはトランザクションの中に入れて、それを修正することを知りませんでしたか? – gzaxx

+1

ありがとうございました。うまく働いています...私は本当に感謝しています。 – barsan

17

使用MERGE

MERGE INTO Delegates D 
USING (values(@MemNo, @FromYr,@ToYr)) X ([MemNo],[FromYr],[ToYr]) 
ON (insert unique key join) 
WHEN NOT MATCHED BY TARGET THEN 
INSERT ([MemNo],[FromYr],[ToYr])) 
VALUES (X.[MemNo],X.[FromYr],X.[ToYr]); 
+0

ありがとうございます... – barsan

1

は、最初の値が既にあるかどうかのチェックを行いますストアドプロシージャを作成するにはDBに含まれています。彼らがあなたの挿入物をしないならば。彼らは単にそれを無視した場合

2

は(私が確認されていない)、これを試してみてください

INSERT INTO Delegates ([MemNo],[FromYr],[ToYr]) values(@MemNo, @FromYr,@ToYr) 
where @MemNo not in 
(
    SELECT MemNo FROM words WHERE FromYr = @FromYr 
) 
+0

このコードを仲間にありがとうきれいに働く...たくさんのことを感謝します。 – barsan

0

あなたは、コードのこの単純な、1行で重複を挿入避けることができます:それはなら

INSERT INTO Delegates (MemNo, FromYr, ToYr) SELECT @MemNo, @FromYr, @ToYr WHERE NOT EXISTS (SELECT 1 FROM Delegates d WHERE [email protected] AND [email protected])

このコマンドが実行されている間に別のコマンドで重複が挿入される高負荷環境では、WITH(HOLDLOCK)ヒントを使用できます。

2

その列に一意のインデックスを追加するだけで、重複を挿入するとエラーが発生します。正常に失敗する必要がある場合は、エラーを処理することができます

関連する問題