Sql-Server

SQL Server 唯一索引,每個數據子集,基於另一列的值

  • August 26, 2015

假設我有一張Customers桌子和一張Emails桌子。Emails表有這些欄位:

Id   
CustomerId   
EmailValue   

現在,我想創建一個約束,以便每個客戶不應該註冊重複的電子郵件。我能想到的方法是:

  1. 創建一個函式以確保每個新電子郵件值的唯一性,並在檢查約束中呼叫該函式
  2. 創建觸發器,並在每次插入或更新時確保每個客戶的電子郵件不重複
  3. 完全忘記數據庫,把這部分業務放在我的應用層

不過,我最近熟悉了 SQL Server 的過濾索引。雖然我不知道它是否可以在這種特定情況下幫助我。我見過的大多數範例都是過濾掉NULL值,以便為可為空的列創建唯一索引。

有沒有辦法可以使用過濾索引來實現我想要的?

在兩列上創建唯一約束。

alter table dbo.Emails add constraint UQ_Emails unique (CustomerId, EmailValue);

這將防止每個客戶重複電子郵件。不同的客戶仍然可以擁有相同的電子郵件。

來自評論:

如果我也有一個IsDefault欄位怎麼辦?在這種情況下,要求是:

每個客戶應該只有一封活動電子郵件,並且每個客戶不應該有重複的電子郵件”

如果添加過濾的唯一索引,則可以這樣做:

create unique nonclustered index UX_Emails 
on dbo.Emails (CustomerID) 
where IsDefault = 1;

引用自:https://dba.stackexchange.com/questions/94931