我的目标是有一张table叫 emails
还有一张table叫 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??
不然怎么解决这个问题呢?我不太熟悉触发器。。。这是一个合适的解决方案吗?我从来没怎么用过。我一直认为触发器很乱。但我离题了。我在这里征求社区的意见,因为我没有想法,所以也许我需要改变我对触发器的看法。
提前谢谢大家!
1条答案
按热度按时间yhqotfr81#
如果你必须使用外键,你可以
accounts.email
fk列可为空。离开
accounts.email
创建新帐户时为空,直到添加至少一封电子邮件为止。那么UPDATE accounts
当您准备好设置默认电子邮件时。换句话说,除了采取额外的步骤,没有办法做循环引用。
插入到帐户
插入电子邮件
更新帐户以设置默认电子邮件
但老实说,在我工作过或访问过的公司,我很少看到mysql数据库在实际应用程序中使用外键约束。部分原因是难以管理循环引用,但即使引用不是循环的,外键也会导致一些不便,如锁定行为。