唯一索引允许重复条目,前提是其中一个条目为NULL。

28 浏览
0 Comments

唯一索引允许重复条目,前提是其中一个条目为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值时不考虑唯一键吗?有没有办法解决这个问题?

0
0 Comments

在这段内容中,我们可以看到一个关于"Unique index allows duplicate entries in case that one of entries is NULL"的问题。问题的原因是NULL不是一个值,所以不能作为唯一键的一部分。为了解决这个问题,我们可以避免使用NULL,而是使用一个分类来代替。在其他数据库中,这种行为是否是标准行为呢?答案是,每个数据库引擎对NULL的处理方式可能会有所不同,但在这种情况下,使用NULL值作为唯一键在所有数据库引擎中的行为应该是相同的。

在Oracle数据库中,NULL的处理方式也是特殊的。然而,有一些特殊情况下,它将空字符串('')视为NULL。对于这一点,我所指的就是这个问题。

总结起来,为了避免将NULL作为唯一键的一部分,我们应该避免使用NULL并使用一个分类来代替。不同的数据库引擎对NULL的处理方式可能会有所不同,但在这种情况下,使用NULL值作为唯一键的行为在所有数据库引擎中应该是一致的。

0