2013-07-03 17 views
7

Bir tablo adında var:SQL'de INSERT için yinelenen değerler nasıl önlenir?

Delegates 

Bu tablo dört alanları vardır: Bu sorgu ile ekleme am

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

:

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

değerleri kullanıcı girişi geliyor. Bir üye herhangi bir yıl için bir Temsilci olabilir, bu yüzden istedikleri gibi girmelerine izin veriyorum. Ama şimdi sorun, aynı yıl için 2 kereden fazla yanlış bir üye ekleyebilmeleri. Lütfen bana burada ne yapabilirim?

+0

başarısız olması gerekiyorsa hata işleyebilir, o zaman doğal benzersiz anahtar nedir? IDENTITY değeri – gbn

+0

değil, aslında benzersiz bir anahtar yoktur. – barsan

+2

Önce benzersiz bir anahtar ekleyin –

cevap

4

aynı değerlere sahip bir kayıt varsa çek takmadan önce:

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

Bu, yüksek yük altında başarısız olur. – gbn

+0

İşlemin içine koymanın bunu düzeltebileceğini bilmiyor muydunuz? – gzaxx

+1

Teşekkürler çok güzel çalışıyor ... Gerçekten takdir ediyorum .. – barsan

17

Kullanım 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

çok teşekkürler ... – barsan

1

ilk değerler zaten olup olmadığını bir kontrol yapacak bir saklı yordam yapmak DB'de bulunan eğer değilseniz, ekinizi yapacaksınız. onlar sadece bunu göz ardı ederse

2

(doğrulamadım), bu deneyin

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

güzelce çalışmak çok fazla .. – barsan

0

Sen bu kod basit, tek çizgi ile çiftleri ekleyerek önleyebilirsiniz: Örneğin

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

Bu komut yürütülürken başka bir komutun kopyayı ekleyebileceği yüksek bir yük ortamı, WITH(HOLDLOCK) ipucunu kullanabilirsiniz.

2

Sadece bu sütuna benzersiz bir dizin ekleyin, ardından çiftleri eklemek hataya neden olur. Daha sonra

İlgili konular