具有可空列的唯一约束

时间:2010-06-08 11:26:34

标签: mysql innodb

我有一个包含嵌套类别的表。我想避免在同一级别的项目上重复名称(即具有相同父级的类别)。我来这里:

CREATE TABLE `category` (
  `category_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `category_name` varchar(100) NOT NULL,
  `parent_id` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`category_id`),
  UNIQUE KEY `category_name_UNIQUE` (`category_name`,`parent_id`),
  KEY `fk_category_category1` (`parent_id`,`category_id`),
  CONSTRAINT `fk_category_category1` FOREIGN KEY (`parent_id`) REFERENCES `category` (`category_id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci

不幸的是,category_name_UNIQUE没有强制执行我对根级别类别(parent_id为NULL的规则)的规则。有合理的解决方法吗?

2 个答案:

答案 0 :(得分:5)

合理的解决方法可能包括

  • 如果更新/插入操作对速度不重要,则使用触发器检查约束
  • 使用某种特殊值来表示null;这可以相对正确地建模 - 具有永远不会被删除的id为0的根节点,具有parent_id DEFAULT 0和ON DELETE SET DEFAULT

答案 1 :(得分:2)

据我所知,强制执行是在数据库方面,可能性:

  1. 定义“根”节点,只允许添加到根节点,而不是“新”根节点,或
  2. 在更新trirgger之前添加插入之前
  3. 顺便说一句:关于父删除类别被提升为根类别,这是你想要的吗?