【发布时间】:2011-04-12 08:25:40
【问题描述】:
我有一个我想要独一无二的电子邮件专栏。但我也希望它接受空值。我的数据库可以这样有 2 封空电子邮件吗?
【问题讨论】:
标签: mysql database unique-constraint
我有一个我想要独一无二的电子邮件专栏。但我也希望它接受空值。我的数据库可以这样有 2 封空电子邮件吗?
【问题讨论】:
标签: mysql database unique-constraint
是的,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 值。
【讨论】:
WHERE column IS NOT NULL 似乎都没有让我失望,因为我的 MySQL 版本不支持它。有人知道我在哪里可以看吗?
我不确定作者最初是否只是询问这是否允许重复值,或者这里是否有一个隐含的问题询问“如何在使用 UNIQUE 时允许重复的 NULL 值?”或者“如何只允许一个UNIQUENULL 值?”
问题已经得到解答,是的,您可以在使用 UNIQUE 索引时拥有重复的 NULL 值。
因为我在搜索“如何允许一个UNIQUENULL 值”时偶然发现了这个答案。对于在做同样的事情时可能偶然发现这个问题的其他人,我的其余答案是给你的......
在 MySQL 中,你不能有一个 UNIQUE NULL 值,但是你可以通过插入一个空字符串的值来拥有一个 UNIQUE 空值。
警告:数字和字符串以外的类型可能默认为 0 或其他默认值。
【讨论】:
UNIQUE 约束,而是因为NOT NULL 约束。我认为这个答案与问题无关,因为该问题专门针对 UNIQUE 约束的行为。
避免可为空的唯一约束。您始终可以将该列放入新表中,使其非空且唯一,然后仅在您有值时才填充该表。这样可以确保正确强制执行对列的任何键依赖,并避免可能由 null 引起的任何问题。
【讨论】:
一个简单的答案是:No, it doesn't
说明:根据唯一约束的定义(SQL-92)
当且仅当表中没有两行在唯一列中具有相同的非空值时,才满足唯一约束
这句话可以有两种解释:
NULL 和 NULL 是不允许的NULL 和NULL 可以,但不允许使用StackOverflow 和StackOverflow
由于 MySQL 遵循第二种解释,UNIQUE 约束列中允许有多个 NULL 值。其次,如果你尝试理解SQL中NULL的概念,你会发现两个NULL的值根本无法比较,因为SQL中的NULL指的是不可用或未赋值的值(你不能什么都没有比较)。现在,如果您不允许在UNIQUE 约束列中有多个NULL 值,那么您在SQL 中收缩了NULL 的含义。我会这样总结我的答案:
MySQL 支持 UNIQUE 约束,但不以忽略 NULL 为代价 价值观
【讨论】: