首页 新闻 会员 周边

关于数据建表时使用级联删除行的外键的问题,请高手从逻辑上解释,详情见下方

0
悬赏园豆:5 [已解决问题] 解决于 2014-10-18 11:32

//sql建表

create table users
(
id int primary key,
name nvarchar(20)
)

create table dic
(
id int primary key,
registrant int foreign key references users(id) on delete cascade,
name nvarchar(20)
)

create table crop
(
id int primary key,
registrant int foreign key references users(id) on delete cascade,
croptype int foreign key references dic(id) on delete cascade,
name nvarchar(20)
)

//建立第三个表时会提示如下错误:

消息 1785,级别 16,状态 0,第 1 行
将 FOREIGN KEY 约束 'FK__crop__croptype__398D8EEE' 引入表 'crop' 可能会导致循环或多重级联路径。请指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。
消息 1750,级别 16,状态 0,第 1 行
无法创建约束。请参阅前面的错误消息。

=============================

问题是:为什么设置为ON DELETE NO ACTION 或 ON UPDATE NO ACTION就可以了?

北在北方的主页 北在北方 | 初学一级 | 园豆:180
提问于:2014-10-13 20:37
< >
分享
最佳答案
0

当然会报错了。

假设成功执行的话,会出现以下情况

1、删除User行,级联删除dic行

    1。1  由于删除dic行,级联删除crop行。 (croptype int foreign key references dic(id) on delete cascade)

    1。2  级联删除crop行。(registrant int foreign key references users(id) on delete cascade)

1.1与1.2你只保留一个就不会报错了。

 

      

收获园豆:5
爱编程的大叔 | 高人七级 |园豆:30839 | 2014-10-13 23:12

关键是这个多重级联路径吗?

这个多重级联路径是不是这个意思:一个A表一个B表,B通过一个外键直接关联A表,另一个外键间接关联A表,修改A表时,产生级联修改(on delete cascade/on update cascade),B表被修改通过多于一个的路径,一个是间接关联A表的外键,另一个是直接关联A表的外键,而这种现象是不允许的,这多个关联路径只能有一个是cascade,所以才要求设置为on XXX no action,这么说,多不对

北在北方 | 园豆:180 (初学一级) | 2014-10-14 22:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册