2013-07-03 65 views
7

Tôi có một bảng tên là:Làm thế nào để tránh các giá trị trùng lặp cho INSERT trong SQL?

Delegates 

bảng này có bốn lĩnh vực:

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

Tôi chèn với truy vấn này:

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

Các giá trị xuất phát từ người dùng nhập vào. Một thành viên có thể là một đại biểu cho bất kỳ năm nào đó là lý do tại sao tôi cho phép họ nhập dữ liệu như họ muốn. Nhưng bây giờ vấn đề là họ có thể chèn nhầm lẫn một thành viên cho cùng một năm nhiều hơn 2 lần. Xin hãy giúp tôi những gì tôi có thể làm bây giờ ở đây?

+0

Khóa duy nhất tự nhiên là gì? Không phải giá trị IDENTITY – gbn

+0

không có khóa duy nhất nào thực sự có. – barsan

+2

Thêm khóa duy nhất đầu tiên –

Trả lời

4

Trước khi chèn kiểm tra nếu có một kỷ lục với các giá trị như nhau:

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

Điều này sẽ thất bại dưới tải cao – gbn

+0

Không biết rằng, đặt nó bên trong giao dịch sẽ khắc phục điều đó? – gzaxx

+1

Cảm ơn rất nhiều nó đang làm việc độc đáo ... Tôi thực sự đánh giá cao .. – barsan

17

Sử dụng 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

cảm ơn rất nhiều ... – barsan

1

làm một thủ tục lưu trữ mà đầu tiên sẽ thực hiện một kiểm tra về việc các giá trị đã chứa trong DB. nếu họ arent bạn sẽ làm chèn của bạn. Nếu họ chỉ đơn giản là bỏ qua nó

2

Hãy thử điều này, (tôi đã không xác nhận)

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

Cảm ơn bạn bro mã này cũng làm việc độc đáo .. cảm ơn rất nhiều .. – barsan

0

Bạn có thể tránh chèn bản sao với đơn giản, một dòng mã này:

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

Nếu đó là một môi trường tải cao nơi một lệnh khác có thể chèn bản sao trong khi lệnh này đang thực thi, bạn có thể sử dụng gợi ý WITH(HOLDLOCK).

2

Chỉ cần thêm chỉ mục duy nhất trên cột đó, sau đó chèn các từ khóa trùng lặp sẽ gây ra lỗi. Sau đó, bạn có thể xử lý lỗi nếu cần phải thất bại một cách duyên dáng

Các vấn đề liên quan