6

我用 FOREIGN KEY 创建了表,不能插入任何东西。

CREATE TABLE menus (

id int(10),
parent_id int(10),
label varchar(255),
PRIMARY KEY (id),
FOREIGN KEY (parent_id) REFERENCES menus (id)
);

我需要 FOREIGN KEY 在删除父级时自动删除子级。该表已成功创建,但我无法插入任何内容。

INSERT INTO `menus` (`parent_id`, `label`)
VALUES ('1', 'label1');

或者

INSERT INTO `menus` (`label`)
VALUES ( 'label1');
#1452 - Cannot add or update a child row: a foreign key constraint fails

我真的不想在 php 代码中寻找任何孩子,所以我需要以某种方式创建具有 3 列的简单表并自动删除所有孩子和他们的孩子。

4

2 回答 2

10

对于您的所有需求,您应该采用这种结构

CREATE TABLE `menus` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `parent_id` int(11) unsigned DEFAULT NULL,
  `label` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `fk_parent_menu` (`parent_id`),
  CONSTRAINT `fk_parent_menu` FOREIGN KEY (`parent_id`) 
    REFERENCES `menus` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
);

SQL 小提琴演示

Demo展示了父节点的插入和删除

所有孩子的魔法下降部分由ON DELETE CASCADE

于 2013-01-03T12:39:43.617 回答
2

通常,您需要允许 'root' 记录有一个 null 父项 - 即menus.parent_id应该可以为空,并且 'root' 菜单项将有一个 null parent_id

IE

将您的 DDL 更改为:

 parent_id int(10) NULL

然后你将你的根元素添加为 NULL 作为 parent_id

insert into `menus` (id, `label`, parent_id)
VALUES (1, 'label1', null);

那么你最好使用子元素:

insert into `menus` (id, `label`, parent_id)
VALUES (2, 'subitem1', 1);

等等

SQL小提琴在这里

于 2013-01-03T12:38:20.307 回答