在我的职业生涯中,我曾遇到过几次这样的问题,而我当地的同行似乎都无法回答。假设我有一个表,表中有一个“描述”字段,这是一个候选键,只是有时用户会在过程中途停下来。因此,对于25%的记录,此值是null,但对于所有非NULL的值,它必须是唯一的。
另一个示例可能是一个表,该表必须维护一条记录的多个“版本”,并且一个位值指示哪个是“活动”的。因此,总是填充“候选键”,但是可能存在三个相同的版本(活动位为0),只有一个活动版本(活动位为1)。
我有解决这些问题的替代方法(在第一种情况下,在存储过程或业务层中强制执行规则代码,在第二种情况下,用触发器填充存档表,并在需要历史记录时UNION填充表) 。我不希望有替代方法(除非有明显更好的解决方案),我只是想知道是否有任何一种SQL都可以这种方式表示“条件唯一性”。我正在使用MS SQL,所以如果有办法做到这一点,那就太好了。我主要只是在学术上对这个问题感兴趣。
如果您使用的是SQL Server 2008,则索引过滤器可能是您的解决方案:
http://msdn.microsoft.com/en- us/library/ms188783.aspx
这就是我强制具有多个NULL值的唯一索引的方法
CREATE UNIQUE INDEX [IDX_Blah] ON [tblBlah] ([MyCol]) WHERE [MyCol] IS NOT NULL