SQL扩展检查约束

时间:2014-02-25 14:29:26

标签: sql sql-server-2012 check-constraint

是否可以使用复杂的检查约束?

例如,我有一个客户表,其中每个记录都分配了一个客户类型。

因此,我可以拥有几个相同类型的客户。

我想为每种类型设置一个客户作为该类型的“主要”帐户,但每种类型只有一个客户可以是主要客户。

是否可以在IsPrimary字段上添加一个检查约束,检查所有相同类型的客户是否已经标记为主要客户?

我可以在C#代码中做到这一点,但我希望这是一个额外的检查。

我也可以使用触发器,但我想坚持使用约束,以便我可以以相同的方式处理所有错误的错误。

由于

1 个答案:

答案 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