2009-11-18 25 views
25

Estoy tratando de ejecutar algunos scripts de actualización en mi base de datos y estoy consiguiendo el error siguiente:SQL en conflicto con la restricción FOREIGN KEY

The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK_UPSELL_DT_AMRNO_AFMKTG_REF". The conflict occurred in database "ECOMVER", table "dbo.AFFILIATE_MKTG_REF", column 'AMRNO'.

estoy corriendo el siguiente script:

ALTER TABLE [dbo].[UPSELL_DATA] WITH CHECK ADD 
     CONSTRAINT [FK_UPSELL_DT_AMRNO_AFMKTG_REF] FOREIGN KEY 
     (
      [AMRNO] 
     ) REFERENCES [dbo].[AFFILIATE_MKTG_REF] (
      [AMRNO] 
     ) 
GO 

AMRNO es un PK en la tabla AFFILIATE_MKTG_REF.

Además, traté de crear la relación de clave externa utilizando la opción modificar tabla en SQL Management studio y obtuve el mismo error. No estoy seguro de lo que debería estar buscando?

Cualquier sugerencia sería muy apreciada.

+2

Al agregar WITH NOCHECK pude crear la relación FK. Esto no parece ser lo correcto ... –

+4

Esto básicamente hará que la restricción "no sea confiable" (http://www.mssqltips.com/tip.asp?tip=1539); básicamente, esto NO se está verificando. asegúrese de que la restricción sea válida para los datos que ya existen en las tablas y, en cambio, solo verifique los registros recién insertados. – chadhoc

Respuesta

68

Probablemente tenga registros en su tabla [dbo]. [UPSELL_DATA] con valores en la columna [AMRNO] que no existan en la tabla [dbo]. [AFFILIATE_MKTG_REF], columna [AMRNO]. Pruebe con una consulta como esta para encontrar a los que no tienen registros coincidentes:

select * 
from  [dbo].[UPSELL_DATA] u 
left join [dbo].[AFFILIATE_MKTG_REF] m 
on  u.AMRNO = m.AMRNO 
where m.AMRNO is null 
+0

Hola Chad, Gracias por la respuesta. Sí, hay tres registros que regresan de su consulta. ¿Es necesario eliminar estos registros antes de crear el FK? –

+2

Bueno, si desea crear una restricción de confianza, deberá eliminarla de la tabla UPSELL_DATA o crear entradas asociadas en la tabla AFFILIATE_MKTG_REF para las ID dadas. La única otra opción sería mantener/crear una restricción que no sea de confianza como se explica en el enlace anterior (y aquí http://www.mssqltips.com/tip.asp?tip=1539). – chadhoc

+3

Eso es correcto. 5 años de SQL y no pude entender esto hoy, ¿dónde está mi café? –

0

yo creo que hay datos restringidos por intento de clave externa para comprobar los datos de ambas tablas antes de asignar una clave externa, si existen restricciones en ambas mesas.

Cuestiones relacionadas