mysql:对具有多个外键依赖项的表进行更新

ilmyapht  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(293)

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

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,约束note\u ibfk\u 1外键(ss\u id)在更新级联时引用ssid))
据我所知,情况是这样的:
它试图设置state\u sample.id=2。
它看到要注解的级联并尝试更新note.state\u sample\u id。
但是,note.state\u sample\u id也包含在state\u sample\u属性(state\u sample\u id,attribute\u id)的外键中,因此它将检查它是否仍然有效。
由于state\u sample\u attribute.state\u sample\u id尚未更新,因此约束失败。
我的假设正确吗?如果是的话,有办法解决这个问题吗?

nhaq1z21

nhaq1z211#

最终解决的办法是放弃额外的fk:

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

d8tt03nd2#

尝试
禁用键

SET FOREIGN_KEY_CHECKS=0;

一定要把它打开

SET FOREIGN_KEY_CHECKS=1;

之后。

jtoj6r0c

jtoj6r0c3#

把这个给我 ssa 自己的table 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 行。

相关问题