MySQL:不考虑'null'值的唯一索引
我在MySQL v5.6.20中创建关于MySQL:不考虑'null'值的唯一索引,mysql,constraints,Mysql,Constraints,我在MySQL v5.6.20中创建关于null-值的唯一索引时遇到问题。我在这里检查了类似的答案。但不能解决我和他们之间的问题 期望行为 我想要一个引用了其他三个表的表(date\u list\u assignment)。该表的目的是将日期列表-条目映射到课程类别和/或日期列表类别。因此,第一列是强制性的,而后两列不是。如果后两个为null,则日期列表条目声明为全局。如果日期列表条目在此表中没有条目,则它不会显示在任何位置 以下是一些条目示例及其含义: # entry which is glo
null
-值的唯一索引时遇到问题。我在这里检查了类似的答案。但不能解决我和他们之间的问题
期望行为
我想要一个引用了其他三个表的表(date\u list\u assignment
)。该表的目的是将日期列表
-条目映射到课程类别和/或日期列表类别。因此,第一列是强制性的,而后两列不是。如果后两个为null
,则日期列表条目声明为全局。如果日期列表条目在此表中没有条目,则它不会显示在任何位置
以下是一些条目示例及其含义:
# entry which is global within course category 2
date_list_id: 1, course_category_id: 2, date_list_category_id: null
# entry which is global
date_list_id: 1, course_category_id: null, date_list_category_id: null
# entry which is only visible within course category 2 and date list category 17
date_list_id: 1, course_category_id: 2, date_list_category_id: 17
简短版本:我想确保三列的任何组合在表中都是唯一的……不管值是否为null
表模式
我有下表:
CREATE TABLE `date_list_assignment` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date_list_id` int(11) NOT NULL,
`course_category_id` int(11) DEFAULT NULL,
`date_list_category_id` int(11) DEFAULT NULL,
`created` int(11) DEFAULT NULL,
`created_by` int(11) DEFAULT NULL,
`updated` int(11) DEFAULT NULL,
`updated_by` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `IN_relation_unique` (`date_list_id`,`course_category_id`,`date_list_category_id`),
KEY `FK_date_list_assignment_user_created` (`created_by`),
KEY `FK_date_list_assignment_user_updated` (`updated_by`),
KEY `FK_date_list_assignment_course_category` (`course_category_id`),
KEY `FK_date_list_assignment_date_list_category` (`date_list_category_id`),
CONSTRAINT `FK_date_list_assignment_course_category` FOREIGN KEY (`course_category_id`) REFERENCES `course_category` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
CONSTRAINT `FK_date_list_assignment_date_list` FOREIGN KEY (`date_list_id`) REFERENCES `date_list` (`id`) ON UPDATE CASCADE,
CONSTRAINT `FK_date_list_assignment_date_list_category` FOREIGN KEY (`date_list_category_id`) REFERENCES `date_list_category` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
CONSTRAINT `FK_date_list_assignment_user_created` FOREIGN KEY (`created_by`) REFERENCES `user` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
CONSTRAINT `FK_date_list_assignment_user_updated` FOREIGN KEY (`updated_by`) REFERENCES `user` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
问题
如您所见,我在这三列上声明了一个唯一索引(IN_relation_unique
)。但是,我仍然可以创建具有以下值的相同行:
date_list_id: 1, course_category_id: 2, date_list_category_id: null
我知道在当前的MySQL版本中,这种行为发生了一些变化,这也是我使用索引而不是允许空值的复合PK的原因
对于exmaple来说,这是MySQL中的预期行为。如果是这样的话,那么您如何实现这一点呢?因为复合PKs也不再允许空值
谢谢你的帮助 是的,这是MySQL中的预期行为(事实上在ANSI-92中也是如此)
NULL
值在唯一键中不被视为相等的值,并且主键根据定义不能包含NULL
值
当且仅当表中没有两行在唯一列中具有相同的非空值时,才满足唯一约束。此外,如果使用主键定义了唯一约束,则它要求指定列中的任何值都不能为null值
()
由于您在可空列上有外键约束,因此我建议向父表添加一个伪值,说明父表不相关或未确定(ID=0的记录可能),并向列添加
notnull
约束。(此外,您可以将虚拟值添加为默认值)。在SQL中,null
不等于任何值,包括它本身。根据ANSI SQL-92标准,您是对的。但在过去,它与MySQL一起工作,我知道它不再工作了。但是你如何克服这样的问题呢?可能是重复的