Sql-Server
SQL Server 唯一索引,每個數據子集,基於另一列的值
假設我有一張
Customers
桌子和一張Emails
桌子。Emails
表有這些欄位:Id CustomerId EmailValue
現在,我想創建一個約束,以便每個客戶不應該註冊重複的電子郵件。我能想到的方法是:
- 創建一個函式以確保每個新電子郵件值的唯一性,並在檢查約束中呼叫該函式
- 創建觸發器,並在每次插入或更新時確保每個客戶的電子郵件不重複
- 完全忘記數據庫,把這部分業務放在我的應用層
不過,我最近熟悉了 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;