sql-server – 为什么UNIQUE约束只允许一个NULL?

前端之家收集整理的这篇文章主要介绍了sql-server – 为什么UNIQUE约束只允许一个NULL?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
从技术上讲,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列等)时,这将最终成为比整个表组成的索引更小的索引.但是,您可能希望了解筛选索引的一些其他限制:

> How filtered indexes could be a more powerful feature

猜你在找的MsSQL相关文章