use*_*652 6 mysql cascade foreign-keys
我用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)
);
Run Code Online (Sandbox Code Playgroud)
删除父项时,我需要FOREIGN KEY自动删除子项.此表已成功创建,但我无法插入任何内容.
INSERT INTO `menus` (`parent_id`, `label`)
VALUES ('1', 'label1');
Run Code Online (Sandbox Code Playgroud)
要么
INSERT INTO `menus` (`label`)
VALUES ( 'label1');
#1452 - Cannot add or update a child row: a foreign key constraint fails
Run Code Online (Sandbox Code Playgroud)
我真的不想在PHP代码中寻找任何孩子所以我需要以某种方式创建具有3列的简单表并自动删除所有孩子和他们的孩子.
Sir*_*ufo 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
);
Run Code Online (Sandbox Code Playgroud)
演示显示插入和删除父节点
所有孩子的神奇掉落部分都是通过 ON DELETE CASCADE
通常,您需要允许“根”记录具有空父记录 - 即menus.parent_id应该可以为空,并且“根”菜单项将具有 null parent_id。
IE
将您的 DDL 更改为:
parent_id int(10) NULL
Run Code Online (Sandbox Code Playgroud)
然后添加根元素,并将 NULL 作为parent_id
insert into `menus` (id, `label`, parent_id)
VALUES (1, 'label1', null);
Run Code Online (Sandbox Code Playgroud)
那么你就可以使用子元素了:
insert into `menus` (id, `label`, parent_id)
VALUES (2, 'subitem1', 1);
Run Code Online (Sandbox Code Playgroud)
ETC。
| 归档时间: |
|
| 查看次数: |
8921 次 |
| 最近记录: |