Уникальное ограничение с обнуляемым столбцом - PullRequest
4 голосов
/ 08 июня 2010

У меня есть таблица, которая содержит вложенные категории. Я хочу избежать дублирования имен на элементах одного уровня (то есть категориях с одним и тем же родителем). Я пришел с этим:

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 ]

5 голосов
/ 08 июня 2010

Разумный обходной путь может включать

  • проверку ограничений с помощью триггеров, если операции обновления / вставки не критичны для скорости
  • с использованием какого-либо специального значения для обозначения нуля;это может быть смоделировано относительно правильно - иметь корневой узел с идентификатором 0, который никогда не будет удален, иметь parent_id DEFAULT 0 и ON DELETE SET DEFAULT
2 голосов
/ 08 июня 2010

Насколько я понимаю, для принудительного применения на стороне базы данных, возможности:

  1. Определить «корневой» узел, разрешено только добавление к корневому узлу, но не «новый» корневой узел или
  2. Добавить триггер перед обновлением до вставки

Кстати: при родительском удалении категории повышаются до корневых, это то, что вы хотите?

...