从技术上讲,NULL = NULL是False,通过该逻辑,没有NULL等于任何NULL,并且所有NULL都是不同的.这不是暗示所有NULL都是唯一的,唯一索引应该允许任意数量的NULL吗?
解决方法
为什么这样工作?因为回过头来的时候,有人在不知道或不关心标准说什么的情况下作出了设计决定(毕竟,我们确实有各种奇怪的行为与NULL,并且可以随意胁迫不同的行为).该决定规定,在这种情况下,NULL = NULL.
这不是一个非常明智的决定.他们应该做的是使默认行为符合ANSI标准,如果他们真的想要这种特殊行为,允许它通过一个DDL选项,如WITH CONSIDER_NULLS_EQUAL或WITH ALLOW_ONLY_ONE_NULL.
当然,后见之明是20/20.
无论如何,我们现在有一个解决方法,即使它不是最干净或最直观的.
通过创建唯一的筛选索引,可以在sql Server 2008及更高版本中获得正确的ANSI行为.
CREATE UNIQUE INDEX foo ON dbo.bar(key) WHERE key IS NOT NULL;
这允许多个NULL值,因为这些行完全不在重复检查中.如果允许多个NULL(特别是当它不是索引中的唯一列,它具有INCLUDE列等)时,这将最终成为比整个表组成的索引更小的索引.但是,您可能希望了解筛选索引的一些其他限制: