Come evitare i valori duplicati per INSERT in SQL?

Ho una tabella chiamata:

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 provengono dall’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?

Prima di inserire controlla se c’è 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) 

Usa 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]); 

Prova questo, (non ho verificato)

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

Basta aggiungere un indice univoco su quella colonna, quindi l’inserimento di duplicati causerà un errore. È quindi ansible gestirlo in caso di errore, se necessario

effettuare una stored procedure che prima verificherà se i valori sono già contenuti nel DB. se non lo sono, farai il tuo inserto. Se semplicemente lo ignorano

Puoi evitare di inserire duplicati con questa semplice 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, è ansible utilizzare l’ WITH(HOLDLOCK) .