加入收藏 | 设为首页 | 会员中心 | 我要投稿 东莞站长网 (https://www.0769zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2021-03-04 22:45:01 所属栏目:MsSql教程 来源:网络整理
导读:从技术上讲,NULL = NULL是False,通过该逻辑,没有NULL等于任何NULL,并且所有NULL都是不同的.这不是暗示所有NULL都是唯一的,唯一索引应该允许任意数量的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

(编辑:东莞站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读