Ниже приведена упрощенная картина отношений, которые у меня есть в моей БД:
create table attribute (id int auto_increment, primary key (id));
create table state_sample (id int auto_increment, primary key(id));
create table state_sample_attribute (
state_sample_id int,
attribute_id int,
primary key(state_sample_id, attribute_id),
foreign key (state_sample_id) references state_sample(id) on update cascade,
foreign key (attribute_id) references attribute(id) on update cascade
);
create table note (
id int auto_increment,
state_sample_id int,
attribute_id int,
primary key(id),
foreign key (state_sample_id) references state_sample(id) on update cascade,
foreign key (state_sample_id, attribute_id)
references state_sample_attribute(state_sample_id, attribute_id) on update cascade
);
insert into attribute values (1);
insert into state_sample values (1);
insert into state_sample_attribute values (1, 1);
insert into note values (1, 1, 1);
Всякий раз, когда я пытаюсь обновить таблицу ss, происходит сбой:
update state_sample set id = 2;
ОШИБКА 1452 (23000): Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполнено (`demotemplate`` .note`, CONSTRAINT `note_ibfk_1` FOREIGN KEY (` ss_id`) REFERENCES `s` (` id`) ON UPDATECASCADE)
Насколько я понимаю, вот что происходит:
- Он пытается установить state_sample.id = 2.
- Он видитКаскад для заметок и пытается обновить note.state_sample_id.
- Однако note.state_sample_id также участвует во внешнем ключе для state_sample_attribute (state_sample_id, attribute_id), поэтому он проверяет, действителен ли он по-прежнему.
- Поскольку state_sample_attribute.state_sample_id еще не обновлено, ограничение не выполнено.
Верно ли мое предположение?И если так, есть ли способ обойти это?