Mar*_*ers 371
是的,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;
Run Code Online (Sandbox Code Playgroud)
结果:
x
NULL
NULL
1
Run Code Online (Sandbox Code Playgroud)
对于所有数据库都不是这样.例如,SQL Server 2005及更早版本仅允许具有唯一约束的列中的单个NULL值.
我不确定作者最初只是在询问是否允许重复值,或者是否有一个隐含的问题在这里询问"如何NULL
在使用时允许重复值UNIQUE
?" 或者"如何只允许一个UNIQUE
NULL
值?"
问题已经得到解答,是的,您NULL
在使用UNIQUE
索引时可以有重复的值.
因为我在搜索"如何允许一个UNIQUE
NULL
值"时偶然发现了这个答案.对于其他可能在做同样事情时偶然发现这个问题的人,其余的答案都是给你的......
在MySQL中,您不能拥有一个UNIQUE
NULL
值,但是UNIQUE
通过插入空字符串的值可以获得一个空值.
警告:除字符串以外的数字和类型可能默认为0或其他默认值.
一个简单的答案是: No, it doesn't
说明:根据唯一约束的定义(SQL-92)
当且仅当表中没有两行在唯一列中具有相同的非空值时,才满足唯一约束
该声明可以有两种解释:
NULL
和NULL
不允许NULL
和NULL
是好的,但StackOverflow
并StackOverflow
不允许由于 MySQL 遵循第二种解释,因此约束列NULL
中允许有多个值UNIQUE
。其次,如果您尝试理解NULL
SQL 中的概念,您会发现NULL
根本无法比较两个值,因为NULL
SQL 中指的是不可用或未分配的值(您不能将空与空进行比较)。现在,如果您不允许NULL
在UNIQUE
约束列中使用多个值,那么您就是在收缩NULL
SQL 中的含义。我会总结我的回答说:
MySQL 支持 UNIQUE 约束,但不以忽略 NULL 值为代价
避免可为空的唯一约束。您始终可以将列放在新表中,使其变为非空且唯一,然后仅在具有值时填充该表。这样可以确保对列的任何键依赖关系都可以正确实施,并避免了可能由null引起的任何问题。