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

Nun*_*o G 98 sql sql-server indexing constraints unique

我正在使用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)
Run Code Online (Sandbox Code Playgroud)

有更好的想法吗?

Phi*_*den 101

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

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

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

one*_*hen 71

计算出的列技巧被广泛称为"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)
)
Run Code Online (Sandbox Code Playgroud)

  • @Fiziz:改善是旁观者的眼睛.我更喜欢原版的外观. (5认同)

wil*_*hat 26

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

然而,这个人似乎有一个体面的工作: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 /更改唯一约束到允许海报无效值. (74认同)
  • 在2008年你可以参考CREATE UNIQUE INDEX foo ON dbo.bar(key)WHERE key IS NOT NULL; (4认同)
  • 看来你提供的实际上是(部分)被复制,而归属从这里链接的内容:http://decipherinfosys.wordpress.com/2007/11/30/multiple-null-values-in-a-unique-index-在-SQL serverdb2-LUW / (2认同)
  • 我也不同意“违反唯一值的目的”,NULL 不等于 NULL,因此您应该能够在可空列上创建唯一索引并插入多个空值。 (2认同)