首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这些外键约束会导致问题?(Azure SQL Server 12)

为什么这些外键约束会导致问题?(Azure SQL Server 12)
EN

Database Administration用户
提问于 2018-05-22 15:05:52
回答 1查看 1.4K关注 0票数 3

下面是我试图创建的数据库的简化版本:

代码语言:javascript
复制
create table Worker (
    ID int,

    constraint PKW
    primary key (ID)
)

create table Business (
    ID int,
    W int,

    constraint PKB
    primary key (ID),

    constraint FKBW
    foreign key (W) references Worker (ID)
    on delete set null on update cascade
)

create table Note (
    ID int,
    B int,
    W int,

    constraint PKN
    primary key (ID),

    constraint FKNB
    foreign key (B) references Business (ID)
    on delete cascade on update cascade,

    constraint FKNW
    foreign key (W) references Worker (ID)
    on delete set null on update cascade
)

基本上,每个企业都有一个分配给它的员工,而任何一个员工都有能力创建一个关于任何企业的说明。我有3个外键约束来反映这些关系,但这会产生错误:

在表'Note‘上引入外键约束'FKNW’可能会导致循环或多个级联路径。指定“删除不操作”或“更新不操作”,或修改其他外键约束。

此设置中没有关系周期。我可以看到,让FKBW on delete cascade创建两个删除路径到备注,但不是用我目前的设置。即使我从FKBW和FBNW中删除了on update cascade,错误仍然存在。我看不出set null是如何制造任何问题的。

任何澄清都将不胜感激!

EN

回答 1

Database Administration用户

发布于 2018-05-26 19:47:27

问题似乎是ON UPDATE CASCADEs,ON DELETEs很好。如果我删除ON UPDATEs,我就不会出错。

根据“外键约束可能会导致循环或多个级联路径?”论堆栈溢出中公认的答案,Server不会对级联路径进行“深度”检查,而只是简单的检查。如果表A中存在对表B的级联约束,则不管目标列如何,这已经在AB之间的级联图中产生了一个边缘。

在这里,我们有一条直接从WorkerNote的路径,还有一条从WorkerBusinessNote的路径。Note在图中出现两次。

尽管在这里,这不会引起特定列的冲突,但这已经足够了,正如Microsoft文章“当您创建可能导致多个级联路径的外键约束时,会发生错误消息1785:”所述:

收到此错误消息是因为在Server中,表不能在由DELETE或UPDATE语句启动的所有级联引用操作的列表中出现超过一次。例如,级联引用操作树必须只有一条路径到级联引用操作树上的特定表。

建议使用触发器来解决此问题。但是,我看到触发器的一个主要问题,因为除了通过主键之外,我不知道如何从inserted伪表中映射deleted伪表中的行。但是,如果更新中发生了更改,则不可能匹配,也无法检测到已更改的值对。

因此,我想除了不更新主键和使用ON UPDATE NO ACTION之外,没有其他办法了。而且通常情况下,人们实际上并不需要更新主键,尽管作为一个选项,这是一个很好的选择。

票数 3
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/207494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档