MySQL InnoDB维护两个表之间的两个关系

时间:2018-05-31 05:44:30

标签: mysql foreign-keys

我的目标是建立一个名为emails的表和一个名为accounts的表,它们之间有两个独立的关系。

  • accountsemails的一对多关系,以便每个帐户可能与一些电子邮件相关联。
  • 一对一的关系,以便每个帐户只与一封电子邮件相关联。

这将允许我的用户向其帐户添加多个电子邮件地址,但强制将其中一封电子邮件设置为“主要”电子邮件。

尝试1

我尝试的第一件事是:

emails          accounts
---             ---

id              id
account         email
email

完成这项工作需要两个外键:

emails ( account ) REFERENCES accounts ( id ) ON DELETE CASCADE
accounts ( id, email ) REFERENCES emails ( account, id )

但是,由于MySQL不推迟外键检查,因此不起作用。

尝试2

我试图摆脱彼此引用的表,因为这会弄乱MySQL中的外键。我尝试的第二件事是:

emails          accounts
---             ---

id              id
account
email
default

此处只需要一个外键:

emails ( account ) REFERENCES accounts ( id )

但也是这个指数:

UNIQUE KEY emails ( account, default )

不幸的是,这不是真正的一对一关系,而是一对一或零关系:它允许帐户与主电子邮件地址关联

尝试3 ??

如何才能解决这个问题呢?我对触发器不是很熟悉......这会是一个合适的解决方案吗?我从来没有真正使用过它们。我一直认为触发器很乱。但我离题了。我在这里征求社区的意见,因为我没有想法,所以也许我需要改变我对触发器的调整。

先谢谢大家!

1 个答案:

答案 0 :(得分:1)

如果必须使用外键,可以使accounts.email FK列可以为空。

创建新帐户时请保留accounts.email NULL,直到您添加至少一封电子邮件。当您准备好设置默认电子邮件时,请UPDATE accounts

换句话说,除了采取额外的步骤之外,没有办法进行循环引用。

  1. 插入帐户
  2. 插入电子邮件
  3. 更新帐户以设置默认电子邮件
  4. 但老实说,在我曾经工作过或访问过的公司的实际应用程序中,我几乎没有看到使用外键约束的MySQL数据库。部分由于难以管理循环引用,但即使引用不是循环引用,外键也会导致一些不便,例如锁定行为。