我最初有两张桌子。
tbl_Vehicle
tbl_VehicleAssignment
当车辆进入时,它有一个最初的受让人,在上面第二个表中的[原始]栏中注明。同时设置ON DELETE CASCADE,因此如果车辆被删除,任何相关的分配记录也将被删除。没问题。
我认为这不是组织数据的最佳方式,并且在VehicleAssignment表上添加规则以强制只有一个车辆可以使用单个1 for Original从长远来看似乎很昂贵。当我这样说时,我有几个这样的表,其中一些会变大,所以考虑性能。
然后我决定改变我的表:
tbl_Vehicle
tbl_VehicleAssignment
问题是,我想添加一个约束,这样如果删除了tbl_VehicleAssignment中的RecordID,它会将Orig_Assignment设置回NULL。
收到以下错误:
引入FOREIGN KEY约束'FK_Orig_Vehicle_VehicleAssignment' 在表'tbl_Vehicle'上可能会导致循环或多个级联路径。 指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他 FOREIGN KEY约束。
但我不确定为什么。如果车辆被删除,它会级联并删除分配记录。但是我还想在删除相关记录时将[Orig_Assignment]设置为NULL。我没有看到两个交叉路径如何导致多个级联路径。有趣的是,如果我使用表设计器向导来创建它,它实际上将约束保存在 tbl_VehicleAssignment 表中,但在 tbl_Vehicle 表上失败,尽管关闭对话框和查看表格中的关系看起来是正确的,显然有些不对劲。
如果我无法解决这个问题,最好的方法是什么?
1。触发 我宁愿远离这个
2。另一个允许空值的表格
所以它会像:
tbl_VehicleOriginal
这将为tbl_Vehicle表中的每一行创建一行。
第3。原件的另一个表格,但仅在出现时
如:
tbl_VehicleOriginal
我想我的问题是,为什么我不能只添加约束?如果不可能,那么组织数据的最佳方式是什么?
UPDATE - 构建示例的脚本
CREATE TABLE [dbo].[A_Vehicle](
[VehicleID] [int] IDENTITY(1,1) NOT NULL,
[Orig_Assignment] [int] NULL,
CONSTRAINT [PK_A_Vehicle] PRIMARY KEY CLUSTERED
(
[VehicleID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[A_VehicleAssignment](
[RecordID] [int] IDENTITY(1,1) NOT NULL,
[VehicleID] [int] NOT NULL,
CONSTRAINT [PK_A_VehicleAssignment] PRIMARY KEY CLUSTERED
(
[RecordID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[A_VehicleAssignment] WITH CHECK ADD CONSTRAINT [FK_A_VehicleAssignment_A_Vehicle] FOREIGN KEY([VehicleID])
REFERENCES [dbo].[A_Vehicle] ([VehicleID])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[A_VehicleAssignment] CHECK CONSTRAINT [FK_A_VehicleAssignment_A_Vehicle]
GO
-- The below will fail
ALTER TABLE [dbo].[A_Vehicle] WITH CHECK ADD CONSTRAINT [FK_Orig_A_VehicleAssignment_A_Vehicle] FOREIGN KEY([Orig_Assignment])
REFERENCES [dbo].[A_VehicleAssignment] ([RecordID])
ON DELETE SET NULL
GO