MySQL:在具有多个外键依赖项的表上进行更新

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL:在具有多个外键依赖项的表上进行更新相关的知识,希望对你有一定的参考价值。

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

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 ss`(`id`)ON UPDATE级联)

据我了解,这是发生的事情:

  • 它尝试设置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,因此约束失败。

我的假设是否正确?如果是这样,有没有办法解决这个问题?

答案

ssa表自己的id主键,并在notes的外键中使用它,而不是引用ss_ida_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排是多余的。

另一答案

尝试

禁用钥匙

要么

SET FOREIGN_KEY_CHECKS=0;

一定要打开它

SET FOREIGN_KEY_CHECKS=1;

后。

另一答案

最终解决它的是减少额外的FK:

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

以上是关于MySQL:在具有多个外键依赖项的表上进行更新的主要内容,如果未能解决你的问题,请参考以下文章

在mysql中创建两个用外键链接的表,插入、删除和更新

如何在 >2 个表上进行外部联接 (Oracle)

从具有多个条目的另一个表更新MYSQL

Sql Server:创建具有多个外键的表

配置具有公共依赖项的 TypeScript 项目以构建多个纯 JavaScript 输出文件

SQL Server:在具有两列的表上进行无聚合的旋转