MySQL:更新具有多个外键依赖项的表

时间:2018-10-24 21:44:58

标签: mysql sql foreign-keys

下面是我在数据库中的关系的简化图:

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`外键(`ss_id`)参考`ss`(`id`) )在更新级联上)

据我了解,这是发生了什么

  • 它将尝试设置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 :(得分:2)

export `LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/install/` 表提供其自己的ssa主键,并在id的外键中使用该主键,而不是引用notesss_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行是多余的。

答案 1 :(得分:0)

尝试

  

禁用键

SET FOREIGN_KEY_CHECKS=0;

确保将其打开

SET FOREIGN_KEY_CHECKS=1;

之后。

答案 2 :(得分:0)

最终解决此问题的方法是删除多余的FK:

alter table note drop foreign key (state_sample_id) references state_sample(id);