2013-01-03 11 views
6

Ho creato una tabella con FOREIGN KEY e non posso inserire nulla.FOREIGN KEY fa riferimento alla colonna della stessa tabella. Impossibile inserire i valori

CREATE TABLE menus (

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

Ho bisogno di FOREIGN KEY per eliminare automaticamente i bambini quando genitore è stato eliminato. Questa tabella è stata creata correttamente ma non riesco a inserire nulla.

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

o

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

Io davvero non voglio cercare tutti i bambini nel codice php quindi ho bisogno in qualche modo creo semplice tabella con 3 colonne e automaticamente cadere tutti i bambini e loro bambini.

+2

Hai detto di voler "eliminare automaticamente i bambini", ma tutti quelli che ci mostri sono gli inserti. Qual è esattamente la tua domanda? –

+3

In genere, è necessario consentire al record "root" di avere un genitore null - ad esempio "menus.parent_id" dovrebbe essere annullabile, e la voce di menu "root" avrà un valore nullo "parent_id". – StuartLC

+1

quali valori vuoi avere per l'ID? Non ho visto nessuno di loro inserito o generato automaticamente –

risposta

2

In genere, è necessario consentire al record "root" di avere un genitore nullo, ad esempio menus.parent_id dovrebbe essere annullabile e la voce di menu "root" avrà un valore nullo parent_id.

cioè

Modifica della DDL per:

parent_id int(10) NULL 

E poi si aggiunge l'elemento radice con NULL come parent_id

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

allora siete pronti per partire con elementi figlio:

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

ecc

SQL Fiddle here

+0

Il 'parent_id' è già annullabile (per impostazione predefinita). L'errore è corretto come dici tu, nel codice di inserimento. –

+0

questo è solo a metà, manca la cancellazione automatica di childs: o) –

10

Per tutte le esigenze che si dovrebbe prendere questa struttura

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 Fiddle DEMO

demo mostra l'inserimento e la cancellazione di un nodo padre

La parte magica caduta per tutti i bambini è fatto da ON DELETE CASCADE

+0

non funziona, ne sei sicuro? –

+0

@goodmood cosa non ha funzionato? –

+0

guarda la tua demo http://sqlfiddle.com/#!2/7646f –

Problemi correlati