MySQL:UNIQUE但DEFAULT NULL - 允许在创建表时使用。可以插入多个NULL。为什么?

8

我刚刚检查了一下,发现可以创建一个默认为 NULL 的列的表,虽然它同时是一个唯一键(UNIQUE KEY):

CREATE TABLE IF NOT EXISTS `u789` (
`column1` varchar(10) DEFAULT NULL,
UNIQUE KEY (column1)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

我理解,这看起来很奇怪,没有太多意义。我期望第二个插入是
INSERT INTO u789 VALUE (NULL);

将会失败。

但是,它可以毫无问题地插入第一、第二和第三个空值。有谁能解释为什么如果表中已经有NULL,它还会插入第二和第三列呢?

这是一个理论性的问题(据我所知,在大多数情况下,没有人将DEFAULT NULL + UNIQUE KEY用于同一列),但我想了解为什么一旦该列中已经存在NULL,它就不会抛出错误。我在声明唯一列时做错了什么吗?

谢谢。


可能是重复的问题?https://dev59.com/oXM_5IYBdhLWcg3wgzdl - eaj
是的,你说得对。谢谢你发布那个帖子的链接。 - Haradzieniec
1
我知道很多情况下需要考虑唯一性和空值,比如现在我正在开发一个POS系统,邮箱并不是必填项,但如果用户填写了邮箱,那么它必须是唯一的。 - Dvid Silva
2个回答

22

根据 SQL 92 规范(以及您读取规范的方式),唯一约束用于表示候选键,因此不应允许重复值 NULL 值。DB2 以这种方式实现它们的唯一约束。许多数据库供应商(包括 MySQL)将规范解释为忽略 NULL 值,就像 Group By 子句忽略 NULL 值一样,因此它们实现唯一约束,仅适用于非 NULL 值。而其他一些则将 NULL 视为其自己的特殊值,并且只允许一个条目为 NULL。Microsoft SQL Server 以这种方式实现唯一约束。所有供应商关于唯一约束的一致方面是非 NULL 值必须是唯一的。


6

因为NULL不等于NULL。尽管有些关系型数据库管理系统(例如SQLServer)在唯一约束条件下将两个NULL视为相等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接