2009-11-18 184 views
25

我試圖運行我的數據庫中的一些更新腳本,我收到以下錯誤發生衝突:SQL與外鍵約束

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'.

我運行下面的腳本:

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是表AFFILIATE_MKTG_REF中的PK。

此外,我試圖使用SQL管理工作室中的修改表選項創建外鍵關係,並且我得到了同樣的錯誤。我不確定我應該尋找什麼?

任何建議將不勝感激。

+2

通過添加WITH NOCHECK,我能夠創建FK關係。這似乎不是正確的事情... – 2009-11-18 20:53:21

+4

這基本上會使約束「不受信任」(http://www.mssqltips.com/tip.asp?tip=1539) - 基本上,這不是檢查確保約束對錶中已經存在的數據有效,而只會檢查新插入的記錄。 – chadhoc 2009-11-18 20:55:30

回答

68

您可能在您的[dbo]。[UPSELL_DATA]表中有[AMRNO]列中不存在[dbo]。[AFFILIATE_MKTG_REF]表[AMRNO]列中的值的記錄。嘗試這樣的查詢找到那些沒有匹配記錄:

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

你好乍得, 感謝您的答覆。是的,有三條記錄會從您的查詢中返回。在創建FK之前是否需要刪除這些記錄? – 2009-11-18 21:03:19

+2

好吧,如果你想創建一個受信任的約束,你必須從UPSELL_DATA表中刪除它們,或者在給定ID的AFFILIATE_MKTG_REF表中創建關聯的條目。唯一的其他選擇是保持/創建一個不受信任的約束,如上面鏈接(以及http://www.mssqltips.com/tip.asp?tip=1539)中所討論的。 – chadhoc 2009-11-18 21:07:16

+3

這是正確的。 5年的SQL,今天我無法弄清楚這個問題,我的咖啡在哪裏。 – 2013-04-23 20:18:32

0

我覺得你有外鍵嘗試限制指定一個外鍵前檢查這兩個表中的數據數據,是否有限制在兩張桌子上。