0

是否有可能有一个复杂的检查约束?

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

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

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

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

我显然可以在 C# 代码中执行此操作,但我希望将此作为额外检查。

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

谢谢

4

1 回答 1

4

这不完全是一个检查约束问题。这是一个过滤的唯一索引问题。

create unique index customers_type_isprimary on customers(type)
    where isPrimary = 1;

这将保证最多有一个客户isPrimary为每种类型设置标志。

编辑:

过滤索引是一个有趣的创造。除了文档之外,还有各种资源可以解释它们(例如this ) 。

这个想法是仅where在与索引创建步骤中的子句匹配的行上构建索引。这样做的一个原因是减小索引的大小。

这是您的数据结构的用例。您可能有一堆筛选条件的查询isPrimary = 1。您永远不会过滤isPrimary = 0-您只需将其排除在where子句之外。为什么要用所有不必要的值来混淆索引?如果谓词在查询中,则可以使用索引。

unique指数的案例更具说服力。过滤的唯一索引完全符合您的要求 - 确保IsPrimary为每种类型设置最多一个值。它通过type仅为已IsPrimary设置的客户创建索引来做到这一点。索引的“唯一”部分保证每种类型在索引中只出现一次,并且通过扩展,只有一个客户可以IsPrimary为每个type.

于 2014-02-25T14:41:59.247 回答