唯一索引不起作用

时间:2018-06-24 06:51:05

标签: sql-server indexing

我有一个条件所在的唯一索引。但它不起作用。也许我缺少了一些东西。

CREATE UNIQUE NONCLUSTERED INDEX [IDX_NBR_TIN_INFO_PASSPORT] 
ON [dbo].[NBR_TIN_INFO] ([PASSPORT_NUMBER] ASC)
WHERE (([PASSPORT_NUMBER] IS NOT NULL) AND ([IS_TOKEN_APPROVED] <> 0))
GO

插入表中的数据如下所示:

PASSPORT_NUMBER | IS_TOKEN_APPROVED
----------------+-------------------
XXX-487545      | NULL
XXX-487545      |   0
XXX-487545      | NULL

但是第1行或第3行应被索引阻止。

2 个答案:

答案 0 :(得分:0)

发生这种情况是因为在每个比较中NULL都是未知的,即0 = NULL也不是0 <> NULL。因此,您不会为这些行建立索引。试试这个:

WHERE (([PASSPORT_NUMBER] IS NOT NULL)
  AND ([IS_TOKEN_APPROVED]<>0 OR [IS_TOKEN_APPROVED] IS NULL))

答案 1 :(得分:0)

您需要通过将两个列都添加到索引中并删除过滤器来解决此问题

CREATE UNIQUE NONCLUSTERED INDEX [IDX_NBR_TIN_INFO_PASSPORT] 
    ON [dbo].[NBR_TIN_INFO] ([PASSPORT_NUMBER] ASC), 
       [dbo].[NBR_TIN_INFO] ([IS_TOKEN_APPROVED])
GO