外键约束中的mysql循环依赖

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_1FOREIGN KEY(belongs_to)REFERENCES users(id)ON DELETE NO ACTION ON UPDATE NO ACTION)

我怀疑这是由于循环依赖,但我怎么能解决它(保持参照完整性)?

a_h*_*ame 7

解决此问题的唯一方法(至少使用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列的解决方案


Adr*_*der 6

我不会这样实现它.

primary_identity从表中删除字段users,并向user_profiles调用的表添加一个附加字段is_primary,并将其用作主要配置文件的指示符

  • 嗯,如果我这样做,我无法确保每个用户只有一个主要身份. (6认同)
  • +1设计方面我同意但是为了争论,如何处理循环引用? (2认同)
  • 不幸的是,这是**鸡蛋情况**.如何在没有其他的情况下创造1? (2认同)