多个级联路径警告并不确定原因。如果我不能做的替代方案?

时间:2016-01-06 18:29:11

标签: sql-server tsql

我最初有两张桌子。

tbl_Vehicle

  • VehicleID int identity

tbl_VehicleAssignment

  • RecordID int identity
  • VehicleID int FK
  • EmployeeID int
  • 原位

当车辆进入时,它有一个最初的受让人,在上面第二个表中的[原始]栏中注明。同时设置ON DELETE CASCADE,因此如果车辆被删除,任何相关的分配记录也将被删除。没问题。

我认为这不是组织数据的最佳方式,并且在VehicleAssignment表上添加规则以强制只有一个车辆可以使用单个1 for Original从长远来看似乎很昂贵。当我这样说时,我有几个这样的表,其中一些会变大,所以考虑性能。

然后我决定改变我的表:

tbl_Vehicle

  • VehicleID int identity
  • Orig_Assignment int NULL

tbl_VehicleAssignment

  • RecordID int identity
  • VehicleID int FK
  • EmployeeID int

问题是,我想添加一个约束,这样如果删除了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

  • VehicleID int
  • Orig_Assignment int NULL
  • Orig_SomethingElse int NULL
  • Orig_Etc。 int NULL

这将为tbl_Vehicle表中的每一行创建一行。

第3。原件的另一个表格,但仅在出现时

如:

tbl_VehicleOriginal

  • VehicleID int PK
  • RecordType PK
  • RecordID FK

我想我的问题是,为什么我不能只添加约束?如果不可能,那么组织数据的最佳方式是什么?

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

0 个答案:

没有答案