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 NULL
s 视为相等。
【讨论】:
以上是关于MySQL:唯一,但默认为 NULL - 通过创建表允许。允许插入超过 1 个 NULL。为啥?的主要内容,如果未能解决你的问题,请参考以下文章