SQL:是否可以在具有唯一约束的列中存储重复的空值

时间:2014-08-05 07:45:46

标签: sql database unique

如何根据空值定义唯一约束? 是否所有数据库都遵循任何标准,以允许在唯一列中使用空值。

3 个答案:

答案 0 :(得分:1)

引自blog,这里是在一些DBMS中具有UNIQUE约束的列中允许的NULL值的数量:

  

其他DBMS做什么

     

Trudy Pelzer和我在我们的书SQL Performance的第260页上写了这篇文章   调整:DBMS存在UNIQUE时的最大NULL数   约束

     

IBM(DB2)One

     

Informix One

     

Ingres Zero

     

InterBase Zero

     

Microsoft(SQL Server)One

     

MySQL很多[虽然BDB存储引擎是一个例外]

     

Oracle很多

     

Sybase One

在Sql Server中尝试以下代码(至少2012 Express)失败,正如所料:

DECLARE @T TABLE
(
    value int unique
)
INSERT INTO @T VALUES(1)
INSERT INTO @T VALUES(2)
INSERT INTO @T VALUES(NULL)
INSERT INTO @T VALUES(NULL)

文章提到关于在具有唯一约束的列中处理空值的正确规则应该是任何两行的唯一列的值(如果两者都不是NULL)不应该相等。

换句话说,非空值必须是唯一的,并且允许多个空值。

但并非所有DBMS似乎都应用该规则,因此最好通过简单的测试来确认它。

答案 1 :(得分:0)

" ... UNIQUE列可以连续有多个NULL,除非您向每列显式添加NOT NULL约束。"

Joe Celko" SQL for Smarties",2nd edition,Page 16。

对于使用NULL-s的一些乐趣,请尝试以下方法:

SELECT 1 = NULL (返回NULL

SELECT 1 IS NULL (返回FALSE

答案 2 :(得分:0)

这取决于数据库引擎。 MySQL允许空重复,但SQL Server没有。

您可以在SQLFiddle上尝试此操作。 MySQL为用户'ddd'返回异常,而MySQL为用户'ccc'

返回异常
CREATE TABLE users (
  username varchar(20) NOT NULL,
  id int unique
);

insert into users values ('aaa', null);
insert into users values ('bbb', 1);
insert into users values ('ccc', null);
insert into users values ('ddd', 1);