MySQL:UNIQUE,但DEFAULT NULL - 通过创建表允许。允许插入超过1个NULL。为什么?

时间:2011-11-15 20:25:53

标签: mysql null default unique

我刚检查过并且允许创建一个默认为NULL的表,尽管它同时是一个独特的键:

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已经在列中,它就不会抛出错误。我在宣布一个独特的列时做错了吗?

谢谢。

2 个答案:

答案 0 :(得分:21)

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

答案 1 :(得分:6)

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