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フィドルデモ

デモは、親ノードの挿入と削除を示しています

すべての子供のための魔法のドロップ部分はによって行われますON DELETE CASCADE

于 2013-01-03T12:39:43.617 に答える
2

通常、「ルート」レコードが null の親を持つことを許可する必要があります。つまり、nullmenus.parent_id可能である必要があり、「ルート」メニュー項目には null がありますparent_id

すなわち

DDL を次のように変更します。

 parent_id int(10) NULL

次に、parent_id として NULL を使用してルート要素を追加します。

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 に答える