MySQL:唯一,但默认为 NULL - 通过创建表允许。允许插入超过 1 个 NULL。为啥?

Posted

技术标签:

【中文标题】MySQL:唯一,但默认为 NULL - 通过创建表允许。允许插入超过 1 个 NULL。为啥?【英文标题】:MySQL: UNIQUE, but DEFAULT NULL - allowed by creating of table. More than 1 NULL is allowed to insert. Why?MySQL:唯一,但默认为 NULL - 通过创建表允许。允许插入超过 1 个 NULL。为什么? 【发布时间】:2011-11-15 20:25:53 【问题描述】:

我刚刚检查过,它允许创建一个默认为 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 值没有任何问题。谁能解释我为什么如果 NULL 已经在表中,它会插入第二列和第三列?

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

谢谢。

【问题讨论】:

可能是重复的? ***.com/questions/1346765/… 是的,你是对的。感谢您发布指向该主题的链接。 我知道很多情况下唯一和空,例如我现在正在做这个POS系统并且电子邮件不是强制性的,但是如果这个人添加了电子邮件,它必须是唯一的。 【参考方案1】:

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

【讨论】:

【参考方案2】:

因为NULL 不等于NULL。即使某些 RDMS(例如 SQLServer)在涉及唯一约束时将 2 NULLs 视为相等。

【讨论】:

以上是关于MySQL:唯一,但默认为 NULL - 通过创建表允许。允许插入超过 1 个 NULL。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

mysql 主键索引和唯一索引的区别

Mysql 完整性约束

Mysql数据唯一约束与唯一索引案例总结及踩坑记(含NULL值与唯一约束唯一索引的搭配使用)

MySQL的数据完整性与数据类型

mysql 主键和唯一索引的区别

mysql default设置了默认值但插入依然为null