下面是我在数据库中的关系的简化图:
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`) )在更新级联上)
据我了解,这是发生了什么
我的假设正确吗?如果是这样,有没有办法解决这个问题?
答案 0 :(得分:2)
为export `LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/install/`
表提供其自己的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
行是多余的。
答案 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);