Sql-Server
如何約束多對多將單個記錄標記為“預設”?
假設我有以下實體:
customer(id, name)
template(id, name)
使用連接表:
customer_template(id, customerId, templateId, is_default)
客戶可以有任意數量的模板,但只允許一個作為預設模板。
如何約束連接表,以便分配一個且只有一個預設模板?
您可以使用過濾的唯一索引。
create unique nonclustered index ixf_customer_template_default on dbo.customer_template(customerId,is_default) where is_default = 1;
這將只允許每個客戶有一個預設行和任意數量的非預設行。
rextester 展示:http ://rextester.com/HLQB10886
create table customer_template( id int identity(1,1) , customerId int , templateId int , is_default bit ); create unique nonclustered index ixf_customer_template_default on dbo.customer_template(customerId,is_default) where is_default = 1; insert into customer_template values (1,1,0),(1,2,0),(1,3,1); /* error when adding another default */ insert into customer_template values (1,4,1)
無法在具有唯一索引“ixf_customer_template_default”的對象“dbo.customer_template”中插入重複的鍵行。重複鍵值為 (1, 1)。該語句已終止。