具有非识别关系的 MySQL 外键

发布于 2024-12-07 12:19:18 字数 1374 浏览 1 评论 0原文

我需要的只是创建 2 个具有下一个结构的表格: 在此处输入图像描述

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)

问题: 如何创建一个表,该表的索引与同一个表中的花药索引具有非识别关系?有些行有父行,有些则没有。

All I need is to create 2 tabeles with next structure:
enter image description here

The 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;

But when I try to insert first row to my table "module_news_cats", I recive next error:

#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)

Question:
How I can create table which will have an index with non-identifying relationship to the anther index in the same table? Some rows will have parents, and some not.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

油焖大侠 2024-12-14 12:19:18

我认为您只需要在 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 的行。

I think you just need to allow NULLs in 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 ;

and then if there isn't a parent, create the row with a NULL in parent.

北斗星光 2024-12-14 12:19:18

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

如果将 module_news_cats 表中的“父”字段设置为可为空:

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

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

Your 'parent' field cannot be empty (NULL) if you insert a record, which means that every record you insert should refer to a parent ID (which is impossible if there are no entries in your table yet).

If you make the 'parent' field in the module_news_cats table nullable:

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

you should be able to insert records that have no parent ID associated (just supply NULL instead of a value).

把梦留给海 2024-12-14 12:19:18

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

然后,对于没有父项的行,用 null 填充父列。

You could make the parent column in the module_news_cats table nullable.

Then for rows that have no parents populate the parent column with null.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文