有可能有一个复杂的检查约束吗?
例如,我有一个customers表,其中每个记录都分配了一个customer类型。
因此,我可以有几个相同类型的客户。
我想为每种类型设置一个客户,作为该类型的“主要”帐户,但是每种类型只有一个客户可以是主客户。
是否可以在IsPrimary字段中添加一个check约束,检查所有相同类型的客户,看看是否已经有一个标记为主用户?
显然,我可以在C#代码中这样做,但我希望这是额外的检查。
我也可以使用触发器,但我想坚持约束,这样我就可以以同样的方式处理所有错误。
谢谢
发布于 2014-02-25 06:41:59
这并不完全是一个检查约束问题。这是一个过滤唯一的索引问题。
create unique index customers_type_isprimary on customers(type)
where isPrimary = 1;
这将确保最多为每种类型设置一个客户的isPrimary
标志。
编辑:
过滤索引是一个有趣的创造。除了这之外,还有各种解释它们的资源(比如文档 )。
其思想是只在索引创建步骤中与where
子句匹配的行上构建索引。这样做的原因之一是为了缩小索引的大小。
这里有一个数据结构的用例。您可能有一堆在isPrimary = 1
上筛选的查询。你永远不会在isPrimary = 0
上过滤--你只需要把它从where
子句中删除。为什么将索引与所有不必要的值混在一起?如果谓词在查询中,则可以使用索引。
unique
指数的情况更有说服力。过滤后的唯一索引完全按照您的要求执行--确保为每种类型设置最多一个IsPrimary
值。为此,它仅为具有type
集的客户在IsPrimary
上创建索引。索引的“唯一”部分保证每种类型只在索引中出现一次,并且扩展到每个type
只能有一个客户设置type
。
https://stackoverflow.com/questions/22017151
复制相似问题