Sql-Server

如何約束多對多將單個記錄標記為“預設”?

  • March 22, 2017

假設我有以下實體:

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)。該語句已終止。

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