唯一索引允许重复条目,前提是其中一个条目为NULL。
唯一索引允许重复条目,前提是其中一个条目为NULL。
我正在使用MySQL数据库。
我创建了一个名为ACTIVITY_CATEGORY的数据库表,其中包含列:ID,ACTIVITY_CATEGORY_ID,NAME,并在NAME,ACTIVITY_CATEGORY_ID上设置了唯一键。
CREATE TABLE `activity_category` ( `ID` bigint(20) NOT NULL AUTO_INCREMENT, `NAME` varchar(45) NOT NULL, `ACTIVITY_CATEGORY_ID` bigint(20) DEFAULT NULL, PRIMARY KEY (`ID`), UNIQUE KEY `NAME_ACTIVITY_CATEGORY_ID` (`NAME`,`ACTIVITY_CATEGORY_ID`), KEY `FK_2l8tu9lwnmh0909gf96ccevwu` (`ACTIVITY_CATEGORY_ID`), CONSTRAINT `FK_2l8tu9lwnmh0909gf96ccevwu` FOREIGN KEY (`ACTIVITY_CATEGORY_ID`) REFERENCES `ACTIVITY_CATEGORY` (`ID`) ) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8
当我执行以下查询时,它会正确地显示重复条目错误:
-- 执行成功 INSERT INTO `ACTIVITY_CATEGORY` (`NAME`, `ACTIVITY_CATEGORY_ID`) VALUES ('Sport', '1'); -- 错误:唯一键'NAME_ACTIVITY_CATEGORY_ID'中的重复条目'Sport-1' INSERT INTO `ACTIVITY_CATEGORY` (`NAME`, `ACTIVITY_CATEGORY_ID`) VALUES ('Sport', '1');
当我执行以下查询时,它的行为有点怪异,因为它不显示重复条目错误:
-- 执行成功 INSERT INTO `ACTIVITY_CATEGORY` (`NAME`, `ACTIVITY_CATEGORY_ID`) VALUES ('Sport', NULL); -- 这应该显示错误,但却执行成功 INSERT INTO `ACTIVITY_CATEGORY` (`NAME`, `ACTIVITY_CATEGORY_ID`) VALUES ('Sport', NULL);
这是怎么可能的?它在插入NULL值时不考虑唯一键吗?有没有办法解决这个问题?
在这段内容中,我们可以看到一个关于"Unique index allows duplicate entries in case that one of entries is NULL"的问题。问题的原因是NULL不是一个值,所以不能作为唯一键的一部分。为了解决这个问题,我们可以避免使用NULL,而是使用一个分类来代替。在其他数据库中,这种行为是否是标准行为呢?答案是,每个数据库引擎对NULL的处理方式可能会有所不同,但在这种情况下,使用NULL值作为唯一键在所有数据库引擎中的行为应该是相同的。
在Oracle数据库中,NULL的处理方式也是特殊的。然而,有一些特殊情况下,它将空字符串('')视为NULL。对于这一点,我所指的就是这个问题。
总结起来,为了避免将NULL作为唯一键的一部分,我们应该避免使用NULL并使用一个分类来代替。不同的数据库引擎对NULL的处理方式可能会有所不同,但在这种情况下,使用NULL值作为唯一键的行为在所有数据库引擎中应该是一致的。