结合UNIQUE和CHECK约束

Bob*_*bby 4 sql constraints

我有一个包含列ab和c的表,如果c为false,那么我只想允许插入,如果列a和b是唯一的,但如果c为true,则a和b不需要是唯一的.

示例:表中只能有一个(foo,bar,false),但没有限制可以有多少(foo,bar,true).

我试过像CONSTRAINT一样的UNIQUE(a,b)AND CHECK(C为TRUE),但我无法弄清楚正确的语法.

gbn*_*gbn 9

  1. 创建一个索引视图,使用过滤器返回a和b WHERE C = false,然后在视图上创建唯一索引.这是一种通用方法

  2. 如果您有SQL Server 2008,则改为创建唯一的筛选索引

  3. 存储过程

  4. 触发(之前或之后)


KM.*_*KM. 5

唯一约束适用于所有行,并且无法仅指定某些行.

检查约束仅适用于单行内的验证.

实现您的要求的唯一方法是执行以下任何操作:

1)创建一个存储过程,其中所有INSERT都来自.您可以在此验证所有逻辑.然而,流氓程序/用户可以避免使用它并打败你的逻辑.

2)创建一个触发器,验证您的逻辑并导致无效的插入/更新失败.应该写入一次处理一组行

3)创建一个检查约束,该约束调用用于执行验证检查的用户定义函数.这被认为是一种不好的做法,应该避免,因为它们非常慢并且可能无法进行多行更新.

我推荐选项#2,触发器,因为这正是触发器的设计目标.


mgv*_*mgv 1

您始终可以创建一个触发器,在插入之前检查所需的条件。