2013-07-03 19 views
7

Ho una tabella denominata:Come evitare i valori duplicati per INSERT in SQL?

Delegates 

Questa tabella ha quattro campi:

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

sto inserendo con questa query:

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

I valori proviene da input dell'utente. Un membro può essere un delegato per qualsiasi anno è per questo che posso consentire loro di inserire come vogliono. Ma ora il problema è che possono inserire erroneamente un membro per lo stesso anno più di 2 volte. Per favore aiutami cosa posso fare ora qui?

+0

Qual è la chiave univoca naturale? Non il valore IDENTITY – gbn

+0

non esiste una chiave univoca. – barsan

+2

Aggiungi prima una chiave univoca –

risposta

4

Prima di inserire verificare se v'è un record con gli stessi valori:

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

Questo fallirà sotto carico elevato – gbn

+0

Non lo sapevo, metterlo in una transazione lo avrebbe risolto? – gzaxx

+1

Grazie mille funziona bene ... Apprezzo molto .. – barsan

17

Uso 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

grazie mille ... – barsan

1

effettuare una procedura immagazzinata che prima fare un controllo sulla se i valori sono già contenuto nel DB. se non lo sono, farai il tuo inserto. Se semplicemente ignorano

2

Prova questa, (non ho verificato)

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

Grazie bro questo codice anche funziona bene..grazie molto .. – barsan

0

È possibile evitare l'inserimento di duplicati con questo semplice, una riga di codice:

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

Se si tratta di un ambiente di carico elevato in cui un altro comando potrebbe inserire il duplicato mentre questo comando è in esecuzione, è possibile utilizzare l'hint WITH(HOLDLOCK).

2

Basta aggiungere un indice univoco su quella colonna, quindi l'inserimento di duplicati causerà un errore. È quindi possibile gestirlo in caso di errore in modo corretto

Problemi correlati