MySQL: обновление таблицы с несколькими зависимостями внешнего ключа - PullRequest
0 голосов
/ 25 октября 2018

Ниже приведена упрощенная картина отношений, которые у меня есть в моей БД:

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 еще не обновлено, ограничение не выполнено.

Верно ли мое предположение?И если так, есть ли способ обойти это?

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Дайте таблице ssa свой собственный первичный ключ id и используйте его во внешнем ключе в notes, а не на ссылки на столбцы ss_id и a_id.

create table ssa (
    id int auto_increment,
    ss_id int, 
    a_id int, 
    primary key (id),
    unique key (ss_id, a_id), 
    foreign key (ss_id) references ss(id) on update cascade, 
    foreign key (a_id) references a(id) on update cascade);
create table note (
    id int auto_increment, 
    ss_id int, 
    ssa_id int, 
    primary key(id), 
    foreign key (ss_id) references ss(id) on update cascade, 
    foreign key (ssa_id) references ssa(id) on update cascade);

Теперь у вас нет избыточной зависимости.

Также не ясно, что note вообще нужно ss_id, так как он избыточен со связанной строкой ssa.

0 голосов
/ 29 октября 2018

Что решило в конце концов, так это сбросив дополнительный FK:

alter table note drop foreign key (state_sample_id) references state_sample(id);
0 голосов
/ 25 октября 2018

Попробуйте

ОТКЛЮЧИТЬ КЛАВИШИ

или

SET FOREIGN_KEY_CHECKS=0;

обязательно включите его

SET FOREIGN_KEY_CHECKS=1;

после.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...