如何将外键引用到多个表?

时间:2016-11-24 08:34:16

标签: sql-server tsql foreign-keys constraints

我正在尝试创建一个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

2 个答案:

答案 0 :(得分:1)

您发布的结构不检查任何给定表中是否存在bomItem,但要求所有表中都必须存在bomItem

你应该通过将BOMHEAD设置为主键表并将其他表的fk设置为在BOMHEAD上引用pk来反过来。

这样可以保证每个其他零件表都有BOMHEAD。

您采取的方法是保证BOMHEAD将包含其他所有部分。

但是如果你坚持认为bomItem需要检查六个表中的任何一个是否存在(可能是为了防止其他表中不需要的引用?),你不能使用fk你需要的是检查约束使用用户定义的函数或创建关联表来维护BOMHEAD与其他人之间的关系。

答案 1 :(得分:0)

所有这些表都应该有通用外键引用的物料清单的通用表。