solo - ¿Cómo evitar valores duplicados para INSERT en SQL?
sql server insertar si no existe (5)
Tengo una mesa llamada:
Delegates
Esta tabla tiene cuatro campos:
ID(Auto increment, Primary)
MemberNo, FromYr, ToYr
Estoy insertando con esta consulta:
INSERT INTO Delegates ([MemNo],[FromYr],[ToYr]) values(@MemNo, @FromYr,@ToYr)
Los valores provienen de la entrada del usuario. Un miembro puede ser un delegado para cualquier año, por eso les dejo ingresar como quieran. Pero ahora el problema es que pueden insertar erróneamente un miembro para el mismo año más de 2 veces. Por favor, ayúdame, ¿qué puedo hacer ahora?
Antes de insertar, compruebe si hay un registro con los mismos valores:
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)
Use 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]);
realice un procedimiento almacenado que primero verificará si los valores ya están contenidos en el DB. si no están, harás tu inserción. Si simplemente lo ignoran
Puede evitar insertar duplicados con esta simple línea de código:
INSERT INTO Delegates (MemNo, FromYr, ToYr) SELECT @MemNo, @FromYr, @ToYr WHERE NOT EXISTS (SELECT 1 FROM Delegates d WHERE d.MemNo=@MemNo AND d.FromYr=@FromYr)
Si se trata de un entorno de carga elevada donde otro comando podría insertar el duplicado mientras se ejecuta este comando, puede usar la sugerencia WITH(HOLDLOCK)
.
Prueba esto, (no lo he verificado)
INSERT INTO Delegates ([MemNo],[FromYr],[ToYr]) values(@MemNo, @FromYr,@ToYr)
where @MemNo not in
(
SELECT MemNo FROM words WHERE FromYr = @FromYr
)