11

次の名前のテーブルが 1 つあります。

Delegates

このテーブルには 4 つのフィールドがあります。

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

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

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

値はユーザー入力から取得されます。1 人のメンバーがどの年でもデリゲートになることができるので、彼らが望むように入力できるようにしています。しかし、今の問題は、同じ年のメンバーを 2 回以上誤って挿入できることです。ここで今何ができるか教えてください。

4

6 に答える 6

19

マージを使用

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]);
于 2013-07-03T08:15:30.587 に答える
7

Before inserting check if there is a record with the same values:

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)
于 2013-07-03T08:16:00.953 に答える
2

これを試してください(私は確認していません)

INSERT INTO Delegates ([MemNo],[FromYr],[ToYr]) values(@MemNo, @FromYr,@ToYr)
where @MemNo not in 
(
    SELECT MemNo FROM words WHERE FromYr = @FromYr
)
于 2013-07-03T08:19:32.810 に答える
1

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

于 2013-07-03T08:16:19.360 に答える
0

次の単純な 1 行のコードで、重複の挿入を回避できます。

INSERT INTO Delegates (MemNo, FromYr, ToYr) SELECT @MemNo, @FromYr, @ToYr WHERE NOT EXISTS (SELECT 1 FROM Delegates d WHERE d.MemNo=@MemNo AND d.FromYr=@FromYr)

このコマンドの実行中に別のコマンドが重複を挿入する可能性がある高負荷環境の場合は、WITH(HOLDLOCK)ヒントを使用できます。

于 2015-10-05T03:26:40.923 に答える