【发布时间】:2014-10-05 21:42:05
【问题描述】:
考虑以下 3 个表格:
create table FOO (
foo_index Numeric(38, 0)
primary key clustered
constraint foo_foo_index_nn not null
identity(1,1)
)
create table BAR (
bar_index Numeric(38, 0)
primary key clustered
constraint bar_bar_index_nn not null
identity(1,1),
foo_index Numeric(38, 0)
constraint bar_foo_index_nn not null
constraint bar_foo_index_fk references FOO(foo_index)
on delete cascade
)
create table BAZ (
baz_index Numeric(38, 0)
primary key clustered
constraint baz_baz_index_nn not null
identity(1,1),
foo_index Numeric(38, 0)
constraint baz_foo_index_fk references FOO(foo_index)
on delete cascade,
bar_index Numeric(38, 0)
constraint baz_bar_index_fk references BAR(bar_index)
on delete cascade
)
每个bar 都需要引用foo。虽然从表创建中看不出来,但其意图是让每个 baz 引用 foo 或 bar,但绝不要同时引用两者。
如果您尝试创建上述架构,您将收到以下错误:Introducing FOREIGN KEY constraint 'baz_bar_index_fk' on table 'BAZ' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
一旦 SQL Server 检测到多个级联路径(在这种情况下,baz 可能同时引用 bar 和 foo,bar 引用和“foo”被删除),而不是尝试检测级联循环它只是不安全。
这在实际使用中永远不会发生,因为计划是只有两个外键之一是非空的。有什么方法可以向 SQL Server 指示使用限制,以便允许两个 FK 在级联时删除?
【问题讨论】:
-
我最近遇到了同样的问题。我不认为这是可能的。您可以使用 DELETE 触发器或始终通过为您进行检查的存储过程进行删除来模拟这一点……后者并不总是可执行的。
标签: sql-server database-design foreign-keys cascade