2
create table test3
(
id int PRIMARY KEY,
id2 int
);

create unique index ndx_id2 on test3 (id2);

出于唯一索引的目的,所有NULL值都被认为与所有其他NULL值不同,因此是唯一的。这是对 SQL-92 标准的两种可能解释之一(标准中的语言是模棱两可的),也是 PostgreSQL、MySQL、Firebird 和 Oracle 遵循的解释。

Informix 和 Microsoft SQL Server 遵循该标准的其他解释。

INSERT INTO test3(id, id2) VALUES (1, null);
INSERT INTO test3(id, id2) VALUES (2, null);

第二次 INSERT 返回

不能将重复值插入唯一索引。[表名=test3,约束名=ndx_id2]

SQL Server 中的错误,但成功地将记录添加到另一个 DBMS,例如 Sqlite。

SQL Server中如何允许在具有唯一约束的字段中输入大量空值?

4

1 回答 1

7

从 SQL Server 2008 起,您可以使用过滤索引

create unique index UX_YourIndex
on YourTable(col1) 
where col1 is not null

SQL Fiddle 的示例。

对于 SQL Server 2005 和更早版本(9.0 对应于 2005),您可以使用代理列。代理列是计算列。计算如下:

  • 当半唯一列不是null时,代理列等于该列
  • 当半唯一列是null时,代理列等于唯一 id。唯一 id 可以是标识列、rowguid 或每行不同的任何内容。

换句话说,只要原始列是 ,代理列就使用唯一的字符串null。例如:

create table YourTable 
    (
    id int identity primary key
,   col1 int
,   surrogate1 as (coalesce(convert(varchar(20), col1), '_' + convert(varchar(20), id)))
    );

create unique index UX_YourIndex on YourTable(surrogate1);

确保代理值不会与实际值发生冲突是您的工作。在此示例中,我假设col1不能以下划线开头。

SQL Fiddle 的示例。

于 2013-04-06T14:46:32.317 回答