关于MySQL:UNIQUE,但默认为NULL:MySQL:UNIQUE,但DEFAULT NULL-通过创建表允许。 允许插入多个NULL。 为什么?

MySQL: UNIQUE, but DEFAULT NULL - allowed by creating of table. More than 1 NULL is allowed to insert. Why?

我刚刚检查了一下,虽然它同时是UNIQUE KEY,但允许创建一个默认列为NULL的表:

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

据我了解,它看起来很奇怪,没有太多意义。 我期望第二次插入

将失败。

但是,它插入第一个,第二个,第三个NULL值没有任何问题。 谁能解释一下如果表中已经有NULL的原因,为什么它会插入第二和第三列?

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

谢谢。


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


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