是否可以使用复杂的检查约束?
例如,我有一个客户表,其中每个记录都分配了一个客户类型。
因此,我可以拥有几个相同类型的客户。我想为每种类型设置一个客户作为该类型的“主要”帐户,但每种类型只有一个客户可以是主要客户。
是否可以在IsPrimary字段上添加一个检查约束,检查所有相同类型的客户是否已经标记为主要客户?
我可以在C#代码中做到这一点,但我希望这是一个额外的检查。
我也可以使用触发器,但我想坚持使用约束,以便我可以以相同的方式处理所有错误的错误。
由于
答案 0 :(得分:4)
这不是一个检查约束问题。这是一个过滤的唯一索引问题。
create unique index customers_type_isprimary on customers(type)
where isPrimary = 1;
这将保证最多只有一个客户为每种类型设置isPrimary
标志。
编辑:
过滤后的索引是一个有趣的创作。除了this之外,还有各种资源解释它们(例如documentation)。
我们的想法是仅在与索引创建步骤中的where
子句匹配的行上构建索引。这样做的一个原因是减小索引的大小。
以下是您的数据结构的用例。您可能会在isPrimary = 1
上过滤一堆查询。您永远不会过滤isPrimary = 0
- 您只需将其从where
子句中删除即可。为什么要用所有不必要的值来混淆索引?如果谓词在查询中,则可以使用索引。
unique
索引的情况更具吸引力。过滤的唯一索引完全符合您的要求 - 确保为每种类型设置最多一个IsPrimary
值。它通过仅在type
设置的客户的IsPrimary
上创建索引来实现此目的。索引的“唯一”部分保证每种类型仅在索引中出现一次,并且通过扩展,只有一个客户可以为每个IsPrimary
设置type
。