MySQL会忽略唯一约束上的空值吗?

vaqhlq81  于 2023-01-16  发布在  Mysql
关注(0)|答案(5)|浏览(197)

我有一个电子邮件列,我希望它是唯一的。但我也希望它接受空值。我的数据库可以有2个空电子邮件这样做?

nzk0hqpo

nzk0hqpo1#

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

55ooxyrt2#

the docs开始:
"UNIQUE索引允许可包含NULL的列具有多个NULL值"
这适用于除BDB之外的所有引擎。

unftdfkk

unftdfkk3#

我不确定作者最初是否只是问这是否允许重复的值,或者这里是否有一个隐含的问题在问,“如何在使用UNIQUE时允许重复的NULL值?”或者“如何只允许一个UNIQUENULL值?”
问题已经回答了,是的,在使用UNIQUE索引时,可以有重复的NULL值。
由于我在搜索“如何允许一个UNIQUENULL值”时偶然发现了这个答案,因此对于其他可能在搜索时偶然发现这个问题的人,我的答案的其余部分是为您准备的...
在MySQL中,您不能有一个UNIQUENULL值,但是您可以通过插入空字符串的值来获得一个UNIQUE空值。

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

xxb16uws4#

一个简单的答案是:No, it doesn't
说明:根据唯一约束的定义(SQL-92)
当且仅当表中没有两行在唯一列中具有相同的非空值时,才满足唯一约束
此语句可有两种解释:

  • 两行不能具有相同的值,即不允许NULLNULL
  • 两个非空行不能有值,例如NULLNULL可以,但StackOverflowStackOverflow不允许

由于MySQL遵循第二种解释,因此UNIQUE约束列中允许多个NULL值。其次,如果您尝试理解SQL中NULL的概念,您会发现根本无法比较两个NULL值,因为SQL中的NULL指的是不可用或未赋值的值(你不能将nothing与nothing进行比较)。现在,如果你不允许在UNIQUE约束列中有多个NULL值,那么你就压缩了SQL中NULL的含义。我可以这样总结我的答案:
MySQL支持UNIQUE约束,但不以忽略NULL值为代价

nwwlzxa7

nwwlzxa75#

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

相关问题