370

我有一个我想要独一无二的电子邮件专栏。但我也希望它接受空值。我的数据库可以这样有 2 封空电子邮件吗?

4

5 回答 5

535

是的,MySQL 允许在具有唯一约束的列中使用多个 NULL。

CREATE TABLE table1 (x INT NULL UNIQUE);
INSERT table1 VALUES (1);
INSERT table1 VALUES (1);   -- Duplicate entry '1' for key 'x'
INSERT table1 VALUES (NULL);
INSERT table1 VALUES (NULL);
SELECT * FROM table1;

结果:

x
NULL
NULL
1

并非所有数据库都如此。例如,SQL Server 2005 和更早版本只允许在具有唯一约束的列中使用单个 NULL 值。

于 2010-09-14T19:34:01.237 回答
135

文档

“一个 UNIQUE 索引允许可以包含 NULL 的列有多个 NULL 值”

这适用于除BDB之外的所有引擎。

于 2010-09-14T19:33:36.523 回答
15

我不确定作者最初是否只是在问这是否允许重复值,或者这里是否有一个隐含的问题询问“如何NULL在使用时允许重复值UNIQUE?” 或者“如何只允许一个UNIQUE NULL值?”

问题已经得到解答,是的,您NULL在使用UNIQUE索引时可以有重复的值。

因为我在搜索“如何允许一个UNIQUE NULL值”时偶然发现了这个答案。对于其他可能在做同样的事情时偶然发现这个问题的人,我剩下的答案是给你的......

在 MySQL 中,您不能有一个UNIQUE NULL值,但是您可以UNIQUE通过插入一个空字符串的值来获得一个空值。

警告:数字和字符串以外的类型可能默认为 0 或其他默认值。

于 2016-11-23T14:38:15.770 回答
7

避免可为空的唯一约束。您始终可以将该列放入新表中,使其非空且唯一,然后仅在您有值时才填充该表。这确保了可以正确强制执行对列的任何键依赖,并避免可能由空值引起的任何问题。

于 2010-09-14T19:46:36.793 回答
7

一个简单的答案是:No, it doesn't

解释:根据唯一约束的定义(SQL-92)

当且仅当表中没有两行在唯一列中具有相同的非空值时,才满足唯一约束

该语句可以有两种解释:

  • 没有两行可以有相同的值NULL,即NULL不允许
  • 没有两个非空行可以有值,即并且NULL很好NULL,但是不允许StackOverflowStackOverflow

由于 MySQL 遵循第二种解释,因此约束列NULL中允许有多个值。UNIQUE其次,如果您尝试理解NULLSQL 中的概念,您会发现两个NULL值根本无法比较,因为NULLSQL 中指的是不可用或未分配的值(您无法将无与无进行比较)。现在,如果您不允许约束列中有多个NULL值,那么您就是在收缩SQL 中的含义。我会总结我的回答:UNIQUENULL

MySQL 支持 UNIQUE 约束,但不支持忽略 NULL 值的成本

于 2020-11-07T19:28:50.943 回答