mysql innodb维护两个表之间的两种关系

mfuanj7w  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(303)

我的目标是有一张table叫 emails 还有一张table叫 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??
不然怎么解决这个问题呢?我不太熟悉触发器。。。这是一个合适的解决方案吗?我从来没怎么用过。我一直认为触发器很乱。但我离题了。我在这里征求社区的意见,因为我没有想法,所以也许我需要改变我对触发器的看法。
提前谢谢大家!

yhqotfr8

yhqotfr81#

如果你必须使用外键,你可以 accounts.email fk列可为空。
离开 accounts.email 创建新帐户时为空,直到添加至少一封电子邮件为止。那么 UPDATE accounts 当您准备好设置默认电子邮件时。
换句话说,除了采取额外的步骤,没有办法做循环引用。
插入到帐户
插入电子邮件
更新帐户以设置默认电子邮件
但老实说,在我工作过或访问过的公司,我很少看到mysql数据库在实际应用程序中使用外键约束。部分原因是难以管理循环引用,但即使引用不是循环的,外键也会导致一些不便,如锁定行为。

相关问题