gpt4 book ai didi

mysql - SQL 强制执行 1 :1 relation

转载 作者:行者123 更新时间:2023-11-29 06:21:51 24 4
gpt4 key购买 nike

我有一个关于数据库建模的问题。

假设我有一个用户表:

users
-------
id:int
name:text

还有一个 user_emails:

user_emails
-----------
id:int
user_id:int
email:text

我在 user_emails.user_id 上添加了一个外键约束,这样它必须匹配 users.id 中的有效条目。

但是,这并不能保证每个用户都会有一个电子邮件。

我知道在应用程序级别我可以轻松地执行此操作(即:通过验证表单中的“电子邮件”字段已填充等)但我想知道,在数据库 (sql) 级别是否有办法强制执行数据的完整性? (也就是说,在这种情况下,每个用户都有一个电子邮件地址?)

谢谢! :)

最佳答案

假设您希望允许用户拥有多封电子邮件,但只是为了保证至少有一封。通过执行以下操作,您可以非常接近 MySQL 约束:

create table Users (
UserId int not null primary key, . . .
. . .
PrimaryEmailId int not null,
constraint fk_PrimaryEmailId foreign key (UserId, PrimaryEmailId) references UserEmails(UserId, UserEmailId)
);

create table UserEmails (
UserEmailId int not null primary key,
UserId int not null,
. . .,
unique (UserId, UserEmailId),
constraint fk_UserEmails_UserId foreign key (UserId) references Users(UserId)
);

这保证:

  • 每个用户只有一个主电子邮件地址。
  • 每封电子邮件都有一个用户。
  • 主电子邮件与指定的用户具有相同的用户。

注意时髦的外键关系的使用。引用 UserEmailId 就足够了。但是,这并不能保证用户是相同的。

您可能还想为电子邮件本身添加一个唯一约束,这样不同的用户就不能共享一封电子邮件。

关于mysql - SQL 强制执行 1 :1 relation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32953258/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com