具有非标识关系的MySQL外键

时间:2011-09-30 09:32:59

标签: mysql innodb foreign-key-relationship

我需要的是创建具有下一个结构的2个tabeles: 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)

问题: 如何在同一个表中创建一个与anther索引具有非标识关系的索引的表?有些行会有父母,有些则没有。

3 个答案:

答案 0 :(得分:3)

我认为您只需要在module_news_cats.parent中允许NULL:

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 ;

然后如果没有父项,请在parent中创建一个NULL行。

答案 1 :(得分:1)

如果插入记录,则“父”字段不能为空(NULL),这意味着您插入的每条记录都应引用父ID(如果您的表中没有条目,则不可能)。

如果你将module_news_cats表中的'parent'字段设为nullable:

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

您应该能够插入没有关联父ID的记录(只提供NULL而不是值)。

答案 2 :(得分:1)

您可以使module_news_cats表中的父列可以为空。

然后,对于没有父项的行,将父列填充为空。