2009-11-18 17 views
25

Sto cercando di eseguire alcuni script di aggiornamento sul mio database e sto ottenendo il seguente errore:SQL conflitto con il vincolo 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'.

sto facendo funzionare il seguente 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 è un PK nella tabella AFFILIATE_MKTG_REF.

Inoltre, ho provato a creare la relazione di chiave esterna utilizzando l'opzione di tabella di modifica in SQL Management studio e ho ottenuto lo stesso errore. Non sono sicuro di cosa dovrei cercare?

Qualsiasi suggerimento sarebbe molto apprezzato.

+2

Aggiungendo WITH NOCHECK sono riuscito a creare la relazione FK. Questo non sembra la cosa giusta da fare ... –

+4

Questo fondamentalmente renderà il vincolo "non attendibile" (http://www.mssqltips.com/tip.asp?tip=1539) - in pratica, questo NON sta controllando per assicurarsi che il vincolo sia valido per i dati già presenti nelle tabelle e che controlli solo i record appena inseriti. – chadhoc

risposta

68

Probabilmente hai record nella tabella [dbo]. [UPSELL_DATA] con valori nella colonna [AMRNO] che non esistono nella tabella [dbo]. [AFFILIATE_MKTG_REF], [AMRNO]. Prova una query come questo per trovare quelli che non hanno i record corrispondenti:

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

Hello Chad, Grazie per la risposta. Sì, ci sono tre record che ritornano dalla tua query. Questi documenti devono essere rimossi prima di creare l'FK? –

+2

Bene, se si desidera creare un vincolo attendibile, sarà necessario eliminarli dalla tabella UPSELL_DATA o creare voci associate nella tabella AFFILIATE_MKTG_REF per gli ID indicati. L'unica altra opzione sarebbe quella di mantenere/creare un vincolo non affidabile come discusso nel link sopra (e qui http://www.mssqltips.com/tip.asp?tip=1539). – chadhoc

+3

Questo è corretto. 5 anni di SQL e io non potevamo immaginarlo oggi, dov'è il mio caffè. –

0

penso che si dispone di dati limitati da provare chiave esterna per verificare i dati su entrambi i tavoli prima di assegnare una chiave esterna, se ci sono restrizioni su entrambi i tavoli.

Problemi correlati