//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就可以了?
当然会报错了。
假设成功执行的话,会出现以下情况
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你只保留一个就不会报错了。
关键是这个多重级联路径吗?
这个多重级联路径是不是这个意思:一个A表一个B表,B通过一个外键直接关联A表,另一个外键间接关联A表,修改A表时,产生级联修改(on delete cascade/on update cascade),B表被修改通过多于一个的路径,一个是间接关联A表的外键,另一个是直接关联A表的外键,而这种现象是不允许的,这多个关联路径只能有一个是cascade,所以才要求设置为on XXX no action,这么说,多不对