Внешние ключи MySQL с неидентифицирующими отношениями - PullRequest
0 голосов
/ 30 сентября 2011

Все, что мне нужно, это создать 2 таблицы со следующей структурой: enter image description here

SQL:

CREATE TABLE IF NOT EXISTS `ds_cats` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `module_news_cats` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parent` int(11) NOT NULL,
  `cat_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_module_news_cats_module_news_cats` (`parent`),
  KEY `fk_module_news_cats_ds_cats1` (`cat_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

ALTER TABLE `module_news_cats`
  ADD CONSTRAINT `fk_module_news_cats_ds_cats1` FOREIGN KEY (`cat_id`) REFERENCES `ds_cats` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  ADD CONSTRAINT `fk_module_news_cats_module_news_cats` FOREIGN KEY (`parent`) REFERENCES `module_news_cats` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION;

Но когда я пытаюсьвставить первую строку в мою таблицу "module_news_cats", я получаю следующую ошибку:

#1452 - Cannot add or update a child row: a foreign key constraint fails (`empty`.`module_news_cats`, CONSTRAINT `fk_module_news_cats_module_news_cats` FOREIGN KEY (`parent`) REFERENCES `module_news_cats` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION)

Вопрос: Как я могу создать таблицу, которая будет иметь индекс с неидентифицирующим отношением к индексу пыльника втот же стол?В некоторых рядах будут родители, а в некоторых нет.

Ответы [ 3 ]

3 голосов
/ 30 сентября 2011

Я думаю, вам просто нужно разрешить NULL в module_news_cats.parent:

CREATE TABLE IF NOT EXISTS `module_news_cats` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parent` int(11) NULL,               -- Change this
  `cat_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_module_news_cats_module_news_cats` (`parent`),
  KEY `fk_module_news_cats_ds_cats1` (`cat_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

, а затем, если родителя нет, создайте строку с NULL в parent.

1 голос
/ 30 сентября 2011

Вы можете сделать родительский столбец в таблице module_news_cats обнуляемым.

Тогда для строк, у которых нет родителей, заполните родительский столбец нулем.

1 голос
/ 30 сентября 2011

Ваше родительское поле не может быть пустым (NULL), если вы вставляете запись, что означает, что каждая вставляемая вами запись должна ссылаться на родительский идентификатор (что невозможно, если в вашей таблице еще нет записей).

Если сделать поле 'parent' в таблице module_news_cats обнуляемым:

ALTER TABLE `module_news_cats` CHANGE `parent` `parent` INT( 11 ) NULL DEFAULT NULL

вы должны иметь возможность вставлять записи, с которыми не связан родительский идентификатор (просто укажите значение NULL вместо значения).

...