每个数据子集的 SQL Server 唯一索引,基于另一列的值

Sae*_*ati 1 sql-server filtered-index unique-constraint

假设我有一张Customers桌子和一张Emails桌子。Emails表有这些字段:

Id   
CustomerId   
EmailValue   
Run Code Online (Sandbox Code Playgroud)

现在,我想创建一个约束,以便每个客户都不应该注册重复的电子邮件。我能想到的方法有:

  1. 创建一个函数以确保每个新电子邮件值的唯一性,并在检查约束中调用该函数
  2. 创建触发器,并在每次插入或更新时确保每个客户的电子邮件不重复
  3. 完全忘记数据库,将这部分业务放在我的应用程序层

但是,我最近熟悉了 SQL Server 的筛选索引。尽管我不知道它在这种特定情况下是否可以帮助我。我见过的大多数示例都是过滤掉NULL值,以便为可空列创建唯一索引。

有没有办法可以使用过滤索引来实现我想要的?

Mik*_*son 5

在两列上创建唯一约束

alter table dbo.Emails add constraint UQ_Emails unique (CustomerId, EmailValue);
Run Code Online (Sandbox Code Playgroud)

这将防止每个客户重复发送电子邮件。不同的客户仍然可以使用相同的电子邮件。

来自评论:

如果我也有一个IsDefault字段怎么办?在这种情况下,要求将是:

每个客户应该只有一个有效的电子邮件,并且每个客户都不应该有重复的电子邮件”

如果您添加过滤的唯一索引,您可以这样做:

create unique nonclustered index UX_Emails 
on dbo.Emails (CustomerID) 
where IsDefault = 1;
Run Code Online (Sandbox Code Playgroud)