MySQL是否在唯一约束上忽略空值?

时间:2010-09-14 19:29:22

标签: mysql database

我有一个我希望独一无二的电子邮件专栏。但我也希望它接受空值。我的数据库可以通过这种方式发送2封空电子邮件吗?

5 个答案:

答案 0 :(得分:344)

是的,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值。

答案 1 :(得分:97)

来自the docs

  

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

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

答案 2 :(得分:6)

我不确定作者最初是否只是询问是否允许重复值,或者此处是否存在隐含问题,"如何在使用{{1}时允许重复的NULL值}&#34?;或者"如何只允许一个UNIQUE UNIQUE值?"

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

由于我在搜索"如何允许一个UNIQUE UNIQUE值时偶然发现了这个答案。"对于那些在做同样事情时偶然发现这个问题的人,其余的答案都是给你的......

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

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

答案 3 :(得分:4)

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

答案 4 :(得分:0)

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

说明:根据唯一约束的定义(SQL-92)

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

此语句可以有两种解释:

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

由于MySQL遵循第二种解释,因此NULL约束列中允许多个UNIQUE值。其次,如果您试图理解SQL中NULL的概念,则会发现两个NULL值可以进行比较,因为SQL中的NULL是指不可用或未分配的值(您不能一无所有比较)。现在,如果在NULL约束列中不允许多个UNIQUE值,则表示SQL中NULL的含义已被压缩。我会总结我的回答:

MySQL支持UNIQUE约束,但不以忽略NULL为代价 值