具有重复NULL的SQL Server UNIQUE约束

时间:2009-11-25 11:40:52

标签: sql-server indexing

  

可能重复:
  How do I create unique constraint that also allows nulls in sql server

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

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

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

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

6 个答案:

答案 0 :(得分:52)

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

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

答案 1 :(得分:4)

重复this question

计算的列技巧被广泛称为“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)
)

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

ALTER DATABASE MyDatabase SET ARITHABORT ON

答案 2 :(得分:3)

如果您正在使用SQL Server 2008,请查看过滤索引以实现您想要的效果。

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

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

答案 3 :(得分:2)

答案 4 :(得分:1)

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

以下是来源 - Creating Indexed Views

答案 5 :(得分:0)

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