检查组中恰好有一个位列设置为 true 的约束

Ric*_*key 3 sql-server sql-server-2014

假设您有一个地址表,如下所示:

dbo.Address
(
    AddressId INT PRIMARY KEY,
    CustomerId INT,
    IsPrimary BIT,
    ...
    more typical address fields
    ...
)
Run Code Online (Sandbox Code Playgroud)

我想要一个检查约束来强制每个客户始终只有一个主要地址,允许我为客户切换主要地址或添加新地址并使其成为主要地址。

我知道我可以有一个约束,即不超过一个是主要的(允许没有一个是主要的),然后在插入/更新一个地址为主要地址之前将所有客户的地址设置为非主要地址。但是,如果客户有地址,其中之一必须始终具有 IsPrimary = 1,我将如何强制执行?

Wor*_*DBA 5

您可以在表上定义一个过滤索引,这将为您执行此操作,无需为此使用检查约束或附加表。

CREATE UNIQUE INDEX IX_Address_UniquePrimaryAddress 
ON dbo.Address(CustomerId) 
WHERE IsPrimary = 1;
Run Code Online (Sandbox Code Playgroud)

这是一个很好的过滤索引链接,应该可以帮助您:

https://msdn.microsoft.com/en-us/library/cc280372.aspx

  • 这将适用于强制执行不超过一个主要地址,但允许客户拥有地址而无需将地址设置为主要地址。 (2认同)
  • @ShaneEstelle 是的,我想得更多,我不再喜欢那个解决方案,因为它会造成鸡和蛋的问题。为了添加客户,您必须首先将地址设置为主要地址。但是要添加地址,您需要一个客户 ID (2认同)