MySQL踩坑系列之2唯一索引之大坑
目录背景先模拟下背景原因如何避免呢?后记
背景
上班时间正在悠闲的划水,突然有研发同学找到我说你们提供的MySQL有BUG,唯一索引为啥能够允许相同的值插入呢,挺多这么一说,我已经大概拆到是什么问题了先模拟下背景
表结构:CREATE TABLE `t1` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(30) DEFAULT NULL COMMENT "name", PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
内容insert into t1(id,name) values(1,"aaa"); insert into t1(id,name) values(2,"bbbb"); insert into t1(id,name) values(3,null); insert into t1(id,name) values(4,null); insert into t1(id,name) values(5,null); insert into t1(id,name) values(6,null); insert into t1(id,name) values(7,null); insert into t1(id,name) values(8,null); insert into t1(id,name) values(9,null);
效果展示,研发同学就说,我命设置的是唯一索引,你的数据库为啥允许重复的数据插入呢?
原因
在mysql 的innodb引擎中,是允许在唯一索引的字段中出现多个null值的。
根据NULL的定义,NULL表示的是未知,因此两个NULL比较的结果既不相等,也不不等,结果仍然是未知。根据这个定义,多个NULL值的存在应该不违反唯一约束,所以是合理的,在oracel也是如此,但是SQLserver是不允许多个null插入的。如何避免呢?
不允许列出现 null 值,即not null,给列增加 default 值,注意default值不能是 null。
这个也是我们要养成良好的建表习惯。
记住MySQL的一句话,能不null就不null!!!后记
给研发小伙伴讲明白之后,小伙伴恍然大悟,说MySQL这个也一个大坑。解释明白后,我也愉快的划水去了。