【发布时间】:2011-03-18 00:51:18
【问题描述】:
在我的职业生涯中,我曾多次遇到过这个问题,但我当地的同行似乎都无法回答。假设我有一个表,其中有一个“描述”字段,它是一个候选键,除了有时用户会在过程中途停止。因此,对于可能 25% 的记录,此值为空,但对于所有非空的,它必须是唯一的。
另一个例子可能是一个表,它必须维护一个记录的多个“版本”,并且一个位值指示哪个是“活动”的。所以“候选密钥”总是被填充,但可能存在三个相同的版本(有效位为 0),只有一个有效(有效位为 1)。
我有解决这些问题的替代方法(在第一种情况下,在存储过程或业务层中强制执行规则代码,在第二种情况下,使用触发器填充存档表并在需要时对表进行 UNION历史)。我不想要替代品(除非有明显更好的解决方案),我只是想知道是否有任何风格的 SQL 可以以这种方式表达“条件唯一性”。我正在使用 MS SQL,所以如果有办法做到这一点,那就太好了。我主要只是在学术上对这个问题感兴趣。
【问题讨论】:
-
执行唯一索引或检查约束无法处理的条件规则的另一种方法是使用触发器。
-
感谢计算机指针。它绝对适用于情况 2。我在发布之前进行了搜索,但我实际上并没有搜索我最终在标题中使用的关键字,否则我会找到它!您发布的链接并没有完全解决情况#1,这在 2005 年和 2008 年通过 Tom H. 的建议和 Arthur 的建议解决了。gbn:我使用的是 2005,这就是为什么我不知道索引过滤器的原因2008.
-
有没有办法让我接受两个答案?
标签: sql sql-server sql-server-2005 unique-constraint check-constraints