唯一索引允许重复条目,以防其中一个条目为NULL

时间:2014-04-18 13:29:50

标签: mysql sql

我正在使用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

当我执行以下查询时,它的行为正确并显示重复条目错误:

-- Executes OK    
INSERT INTO `ACTIVITY_CATEGORY` (`NAME`, `ACTIVITY_CATEGORY_ID`)
VALUES ('Sport', '1');

-- Error Duplicate entry 'Sport-1' for key 'NAME_ACTIVITY_CATEGORY_ID    
INSERT INTO `ACTIVITY_CATEGORY` (`NAME`, `ACTIVITY_CATEGORY_ID`)
VALUES ('Sport', '1');

当我执行以下查询时,它表现得有点奇怪,因为它不显示重复条目错误:

-- Executes OK  
INSERT INTO `ACTIVITY_CATEGORY` (`NAME`, `ACTIVITY_CATEGORY_ID`)
VALUES ('Sport', NULL);

-- This should display error, but executes OK instead  
INSERT INTO `ACTIVITY_CATEGORY` (`NAME`, `ACTIVITY_CATEGORY_ID`)
VALUES ('Sport', NULL);

怎么可能?如果我插入NULL值,它不会考虑Unique键吗?有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

NULL不是值,因此不能用作唯一键的一部分。

您应该避免使用NULL并在此案例中使用类别。我很确定,你的在你的应用程序中是 ,你可以使用一个类别来实现这一点。

an other answer at SO比较。