当前位置:  开发笔记 > 数据库 > 正文

如何在NULL列上创建唯一索引?

如何解决《如何在NULL列上创建唯一索引?》经验,为你挑选了3个好方法。

我正在使用SQL Server 2005.我想将列中的值限制为唯一,同时允许NULLS.

我当前的解决方案涉及视图上的唯一索引,如下所示:

CREATE VIEW vw_unq WITH SCHEMABINDING AS
    SELECT Column1
      FROM MyTable
     WHERE Column1 IS NOT NULL

CREATE UNIQUE CLUSTERED INDEX unq_idx ON vw_unq (Column1)

有更好的想法吗?



1> Phil Haselde..:

使用SQL Server 2008,您可以创建筛选索引:http://msdn.microsoft.com/en-us/library/cc280372.aspx.(我看到西蒙补充说这是一个评论,但认为它应该得到它自己的答案,因为很容易错过评论)

另一种选择是检查唯一性的触发器,但这可能会影响性能.


`在MyTable(Column1)上创建唯一索引UIX,其中Column1不为null
允许索引中的多个空值并从索引中过滤空值是不同的事情.过滤索引实际上会从索引中排除记录,而其他解决方案会将null转换为有用的唯一值.注意区别.
似乎微软已经更新了SSMS以支持这一点.我有SSMS 10.50.1617,在"索引属性"对话框中,您可以选择"过滤器"页面来编辑过滤器.例如"([Column1] IS NOT NULL)"

2> onedaywhen..:

计算出的列技巧被广泛称为"nullbuster"; 我的笔记记录了Steve Kass:

CREATE TABLE dupNulls (
pk int identity(1,1) primary key,
X  int NULL,
nullbuster as (case when X is null then pk else 0 end),
CONSTRAINT dupNulls_uqX UNIQUE (X,nullbuster)
)


@Fiziz:改善是旁观者的眼睛.我更喜欢原版的外观.

3> willasaywhat..:

很确定你不能这样做,因为它违反了独特的目的.

然而,这个人似乎有一个体面的工作:http: //sqlservercodebook.blogspot.com/2008/04/multiple-null-values-in-unique-index-in.html


我不同意它"违反了uniques的目的" - NULL是SQL中的一个特殊值(在许多方面类似于NaN),需要相应地对待.实际上,在SQL Server中实现了各种SQL规范的失败:这里是一个请求"正确实现"的链接:http://connect.microsoft.com/SQLServer/feedback/details/299229 /更改唯一约束到允许海报无效值.
在2008年你可以参考CREATE UNIQUE INDEX foo ON dbo.bar(key)WHERE key IS NOT NULL;
看来你提供的实际上是(部分)被复制,而归属从这里链接的内容:http://decipherinfosys.wordpress.com/2007/11/30/multiple-null-values-in-a-unique-index-在-SQL serverdb2-LUW /
推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有