我正在尝试创建一个BOM
结构,我有6个产品表,其中包含不同的属性以及BOMHEADER
和BOMDETAIL
表。在创建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
答案 0 :(得分:1)
您发布的结构不检查任何给定表中是否存在bomItem
,但要求所有表中都必须存在bomItem
。
你应该通过将BOMHEAD设置为主键表并将其他表的fk设置为在BOMHEAD上引用pk来反过来。
这样可以保证每个其他零件表都有BOMHEAD。
您采取的方法是保证BOMHEAD将包含其他所有部分。
但是如果你坚持认为bomItem
需要检查六个表中的任何一个是否存在(可能是为了防止其他表中不需要的引用?),你不能使用fk你需要的是检查约束使用用户定义的函数或创建关联表来维护BOMHEAD与其他人之间的关系。
答案 1 :(得分:0)
所有这些表都应该有通用外键引用的物料清单的通用表。