2013-07-03 73 views
7

我有一臺命名爲:如何避免在SQL中插入重複值?

Delegates 

這個表有四個字段:

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

我與此查詢插入:

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

值來自用戶的輸入。一名成員可以成爲任何一年的代表,這就是爲什麼我允許他們按照自己的意願進行輸入的原因。但現在的問題是他們可能會錯誤地將同一年的一名成員誤入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

做一個存儲過程,將首先檢查該值是否已經包含在數據庫中。如果他們沒有,你會做你的插入。如果他們根本不理它

2

試試這個,(我沒有驗證)

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

謝謝你bro代碼也很好地工作..感謝很多.. – barsan

0

可避免這個代碼簡單,一行插入重複:

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

只需在該列上添加一個唯一索引,然後插入重複項就會導致錯誤。如果它需要優雅地失敗,那麼你可以錯誤地處理它