是否有可能有一个复杂的检查约束?
例如,我有一个客户表,其中的每条记录都分配了一个客户类型。
因此我可以有几个相同类型的客户。
我想将每种类型的一个客户设置为该类型的“主要”帐户,但是每种类型只有一个客户可以是主要的。
是否可以在 IsPrimary 字段上添加检查约束,检查相同类型的所有客户以查看是否已经有一个标记为主要客户?
我显然可以在 C# 代码中执行此操作,但我希望将此作为额外检查。
我也可以使用触发器,但我想坚持约束,以便我可以以相同的方式处理所有错误。
谢谢
是否有可能有一个复杂的检查约束?
例如,我有一个客户表,其中的每条记录都分配了一个客户类型。
因此我可以有几个相同类型的客户。
我想将每种类型的一个客户设置为该类型的“主要”帐户,但是每种类型只有一个客户可以是主要的。
是否可以在 IsPrimary 字段上添加检查约束,检查相同类型的所有客户以查看是否已经有一个标记为主要客户?
我显然可以在 C# 代码中执行此操作,但我希望将此作为额外检查。
我也可以使用触发器,但我想坚持约束,以便我可以以相同的方式处理所有错误。
谢谢
这不完全是一个检查约束问题。这是一个过滤的唯一索引问题。
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
.