Fla*_*ius 15 mysql sql database-design referential-integrity
鉴于架构:
我需要的是每个user_identities.belongs_to
参考文献users.id
.
同时,每个users
都有一个primary_identity
如图所示.
但是,当我尝试添加此引用时ON DELETE NO ACTION ON UPDATE NO ACTION
,MySQL说
#1452 - 无法添加或更新子行:外键约束失败(
yap
.#sql-a3b_1bf
,CONSTRAINT#sql-a3b_1bf_ibfk_1
FOREIGN KEY(belongs_to
)REFERENCESusers
(id
)ON DELETE NO ACTION ON UPDATE NO ACTION)
我怀疑这是由于循环依赖,但我怎么能解决它(并保持参照完整性)?
解决此问题的唯一方法(至少使用MySQL的有限功能)允许NULL
两个FK列中的值.创建具有主要标识的新用户将看起来像这样:
insert into users (id, primary_identity)
values (1, null);
insert into identities (id, name, belongs_to)
values (1, 'foobar', 1);
update users
set primary_identity = 1
where id = 1;
commit;
Run Code Online (Sandbox Code Playgroud)
此解决方案的唯一缺点是您不能强制用户具有主要标识(因为该列需要可以为空).
另一种选择是更改为支持延迟约束的DBMS,然后您可以只插入两行,并且仅在提交时检查约束.或者使用可以拥有部分索引的DBMS,然后可以使用带有is_primary
列的解决方案
我不会这样实现它.
primary_identity
从表中删除字段users
,并向user_profiles
调用的表添加一个附加字段is_primary
,并将其用作主要配置文件的指示符