关于索引:具有重复NULL的SQL Server UNIQUE约束

SQL Server UNIQUE constraint with duplicate NULLs

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
How do I create unique constraint that also allows nulls in sql server

我有一个表,我需要强制列具有唯一值。
此列必须是可空的,并且应该允许业务逻辑使用多个NULL值,而其他重复值则不允许。

SQL Server UNIQUE约束在这种情况下并不好,因为它将NULL视为常规值,因此它将拒绝重复的NULL。

目前,BLL授予了价值唯一性,所以我不是在寻找一个肮脏的黑客来使其发挥作用。
我只是想知道是否有一个干净的解决方案来在DB中强制执行此约束。

是的,我知道我可以写一个触发器来做到这一点:触发器是唯一的解决方案吗? (或者最好的解决方案呢?)


如果您使用的是SQL Server 2008(不适用于早期版本),则存在过滤索引的概念。您可以在表的已过滤子集上创建索引。

1
2
CREATE UNIQUE INDEX indexName ON tableName(columns) INCLUDE includeColumns
WHERE columnName IS NOT NULL


这个问题有问题吗?

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

1
2
3
4
5
6
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)
)

适用于SQL Server 2000.您可能需要ARITHABORT,例如

1
ALTER DATABASE MyDatabase SET ARITHABORT ON


如果您使用的是SQL Server 2008,请查看Filtered Indexes以实现您的目标。

对于旧版本的SQL Server,触发器的可能替代方法涉及计算列:

  • 创建一个计算列,如果它不是NULL,则使用"唯一"列的值,否则它使用行的主键列(或任何唯一的列)的值。
  • UNIQUE约束应用于计算列。

  • http://www.sqlmag.com/article/articleid/98678/sql_server_blog_98678.html

    1
    will work only in Microsoft SQL Server 2008

    您可以创建一个视图,在该视图中只选择非空值并在其上创建索引。

    这是源 - 创建索引视图


    您应该在该列中使用UNIQUEIDENTIFIER,可以为NULL,并且根据定义也是唯一的。
    希望有所帮助。