2016-11-24 45 views
0

我想創建一個BOM結構我有6個產品表,其中包含不同的屬性和BOMHEADERBOMDETAIL表。在創建BOM結構之前,我希望驗證或檢查六個表中的任何一箇中是否存在bomitem。所以我試圖創建BOMHEADER字段,如下所示使用多個約束,但我得到以下錯誤消息 "The INSERT Statement conflicted with the FOREIGN KEY constraint如何引用外鍵到多個表?

什麼是解決問題的最佳方法。

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE TABLE [dbo].[BOMHEAD](
    [bomItem] [int] NOT NULL, 
    [bomRev] [nvarchar](6) NOT NULL, 
    [rollup] [bit] NULL, 

CONSTRAINT [PK_BOMHEAD_KEY_0] PRIMARY KEY CLUSTERED 
(
    [bomItem] ASC, 
    [bomRev] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

GO 

ALTER TABLE [dbo].[BOMHEAD] WITH CHECK ADD FOREIGN KEY([bomItem]) 
REFERENCES [dbo].[parts] ([itemId]) 
GO 

ALTER TABLE [dbo].[BOMHEAD] WITH CHECK ADD FOREIGN KEY([bomItem]) 
REFERENCES [dbo].[Tires] ([titemId]) 
GO 

ALTER TABLE [dbo].[BOMHEAD] WITH CHECK ADD FOREIGN KEY([bomItem]) 
REFERENCES [dbo].[Discs] ([itemId]) 
GO 

ALTER TABLE [dbo].[BOMHEAD] WITH CHECK ADD FOREIGN KEY([bomItem]) 
REFERENCES [dbo].[Rims] ([itemId]) 
GO 

ALTER TABLE [dbo].[BOMHEAD] WITH CHECK ADD FOREIGN KEY([bomItem]) 
REFERENCES [dbo].[Wheel] ([wheelItemId]) 
GO 

ALTER TABLE [dbo].[BOMHEAD] WITH CHECK ADD FOREIGN KEY([bomItem]) 
REFERENCES [dbo].[Assemblies] ([itemId]) 
GO 
+1

我認爲你的問題可能是它沒有檢查任何表中是否存在外鍵,而是檢查它是否存在於所有表中。 –

+0

@RichBenner我厭倦了'NOCHECK AND CHECK'我得到相同的 – afri

+0

我不認爲外鍵是你以後,看看是否有助於http://stackoverflow.com/questions/30918873/check-if- id-exists-in-multiple-tables你可能需要一個觸發器來做你正在做的事情。 –

回答

0

您應該擁有通過所有這些表通過外鍵引用的BOM的常規表。

+0

你的意思只是爲BOM結構或主產品表?對於BOM結構,我有'BOMDETAIL'表的商店父母和孩子,但我的問題HEADER表彙編物品ID需要檢查。創建主產品表每個表具有超過15個不同的屬性。謝謝 – afri

1

您發佈的結構不是檢查bomItem是否存在於該表中的任何表中,但必須在所有表中存在bomItem

您應該通過將BOMHEAD設置爲主鍵表並將其他表的fk設置爲在BOMHEAD上引用pk來完成。

這樣可以保證每一個零件表都有BOMHEAD。

你做的方式是保證BOMHEAD將擁有其他所有零件。

但如果你堅持認爲bomItem需要無論是在六個表(也許防止其他表不需要引用?),你不能使用FK你需要的是檢查與用戶定義的函數或約束的檢查存在創建維護BOMHEAD和其他之間關係的關聯表。