我的目标是建立一个名为emails
的表和一个名为accounts
的表,它们之间有两个独立的关系。
accounts
到emails
的一对多关系,以便每个帐户可能与一些电子邮件相关联。这将允许我的用户向其帐户添加多个电子邮件地址,但强制将其中一封电子邮件设置为“主要”电子邮件。
尝试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 ??
如何才能解决这个问题呢?我对触发器不是很熟悉......这会是一个合适的解决方案吗?我从来没有真正使用过它们。我一直认为触发器很乱。但我离题了。我在这里征求社区的意见,因为我没有想法,所以也许我需要改变我对触发器的调整。
先谢谢大家!
答案 0 :(得分:1)
如果必须使用外键,可以使accounts.email
FK列可以为空。
创建新帐户时请保留accounts.email
NULL,直到您添加至少一封电子邮件。当您准备好设置默认电子邮件时,请UPDATE accounts
。
换句话说,除了采取额外的步骤之外,没有办法进行循环引用。
但老实说,在我曾经工作过或访问过的公司的实际应用程序中,我几乎没有看到使用外键约束的MySQL数据库。部分由于难以管理循环引用,但即使引用不是循环引用,外键也会导致一些不便,例如锁定行为。