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

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

是的,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只允许具有唯一约束的列中的单个NULL值。

从文档 :

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

这适用于所有发动机,但BDB 。

对于MySql,唯一的约束不会忽略空值,但它不应该。

对mysql bug报告#8173的评论指出:

ANSI SQL-92标准规定两个NULL值应被视为“不明显”。 ANSI标准中不明确的定义包括任何两个为相等性testing返回TRUE的值,或者任何两个NULL值。 这就是为什么GROUP BY将所有空值分组到一个分区的原因。

MySql应该接受空值作为唯一约束的一部分。

避免可空的唯一约束。 您始终可以将列放在一个新表中,使其非空和唯一,然后只有当您有一个值时填充该表。 这确保了对列的任何关键依赖关系都可以正确地执行,并避免可能由空值导致的任何问题。

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

这个问题已经被回答了,是的,你可以在使用UNIQUE索引时重复NULL值。

因为我在search“如何允许一个UNIQUE NULL值”时偶然发现了这个答案。 对于其他人可能会遇到这个问题的同时,其余的答案是给你的…

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

警告:string以外的数字和types可能默认为0或另一个默认值。