У меня есть 3 таблицы, которые связаны друг с другом
- Задача
- клиент
- соблюдение
Соотношение, как показано на схеме ниже
Таблица compliance
имеет внешний ключ, как показано ниже
Таблица task
имеет внешний ключ, как показано ниже
Issue:
Когда я редактирую / обновляю clientno
в client
таблице, я получаю
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)
Я ожидал, что при изменении clientno
в таблице client
, то же самое будет обновлено в таблицах complaince
и task
.
Полагаю, я столкнулся с известным ограничением движка InnoDB. Что не позволяет каскадных обновлений FK. Если это правда, то каково решение обновить 3 таблицы новыми clientno
?
РЕДАКТИРОВАТЬ 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