【发布时间】:2019-01-12 00:53:27
【问题描述】:
我有 3 个相互链接的表
- 任务
- 客户
- 合规
问题:
当我在client 表中编辑/更新clientno 时,我得到了
1452: Cannot add or update a child row: a foreign key constraint fails
(`task`, CONSTRAINT `task_ibfk_1` FOREIGN KEY (`officeid`, `clientid`) REFERENCES `client` (`officeid`, `clientno`) ON UPDATE CASCADE)
我预计,当 client 表中的 clientno 发生更改时,complaince 和 task 表中的相同内容也会更新。
我想我遇到了 InnoDB 引擎的一个已知限制。这不允许对 FK 进行级联更新。如果这是真的,那么用新的clientno 更新 3 个表的解决方案是什么?
编辑 1: 正如@pankaj 指出的,如何克服
如果 ON UPDATE CASCADE 递归更新它之前在级联期间更新的同一个表,它的行为类似于 RESTRICT。这意味着您不能使用自引用的 ON UPDATE CASCADE 操作。这是为了防止级联更新导致无限循环。
编辑 2:
create table client
(
officeid char(6) not null,
clientno char(10) not null,
fname varchar(40) not null,
primary key (officeid, clientno)
);
create index officeid_clientno
on client (officeid, clientno);
create table compliance
(
officeid char(6) not null,
id smallint(5) unsigned not null,
clientid char(10) not null,
primary key (officeid, id),
constraint compliance_ibfk_2
foreign key (officeid, clientid) references client (officeid, clientno)
on update cascade
on delete cascade
);
create index officeid_clientid
on compliance (officeid, clientid, id);
create table task
(
officeid char(6) not null,
taskno char(10) not null,
clientid char(10) not null,
taskname varchar(50) not null,
complianceid smallint(5) unsigned null,
primary key (officeid, taskno),
constraint task_ibfk_1
foreign key (officeid, clientid) references client (officeid, clientno)
on update cascade,
constraint task_ibfk_4
foreign key (officeid, clientid, complianceid) references compliance (officeid, clientid, id)
on update cascade
);
create index officeid_clientid_complianceid
on task (officeid, clientid, complianceid);
仅供参考:我在 mariadb 10.3 和 mysql 8.0 中尝试过
【问题讨论】:
-
这可能会有所帮助 - stackoverflow.com/a/5446693/4050261
-
@GMB,添加表创建语句
-
从
task到compliance创建一个包含officeid和clientid的外键没有意义,因为您已经将这些列包含在client的外键中(这是适当的表)(并且compliance已经具有相同的外键关系)。您应该将该外键更改为仅位于complianceid -
问题在this db fiddlethis db fiddleMariaDB 10.3 上重现
-
@Nick,这将导致
Task表中的记录与Compliance表中的记录不一样clientid
标签: mysql sql mariadb cascade referential-integrity