Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:不考虑'null'值的唯一索引_Mysql_Constraints - Fatal编程技术网

MySQL:不考虑'null'值的唯一索引

MySQL:不考虑'null'值的唯一索引,mysql,constraints,Mysql,Constraints,我在MySQL v5.6.20中创建关于null-值的唯一索引时遇到问题。我在这里检查了类似的答案。但不能解决我和他们之间的问题 期望行为 我想要一个引用了其他三个表的表(date\u list\u assignment)。该表的目的是将日期列表-条目映射到课程类别和/或日期列表类别。因此,第一列是强制性的,而后两列不是。如果后两个为null,则日期列表条目声明为全局。如果日期列表条目在此表中没有条目,则它不会显示在任何位置 以下是一些条目示例及其含义: # entry which is glo

我在MySQL v5.6.20中创建关于
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一起工作,我知道它不再工作了。但是你如何克服这样的问题呢?可能是重复的