2013-03-11 19 views
31

Sono estremamente nuovo a SQL e sto cercando di eseguire un semplice ALTER TABLE per creare una nuova colonna e usarla come chiave esterna per fare riferimento a un'altra semplice tabella nel mio database. Ho alterato entrambe le tabelle di essere InnoDBCome aggiungere Foreign Key (MySQL)

Tuttavia, durante l'esecuzione del codice di ALTER TABLE, ottengo il seguente errore:

Error 1452 Cannot add or update a child row: 
a foreign key constraint fails (`toys`.<result 2 when 
explaining filename '#sql-6d4_6'>, CONSTRAINT 
`#sql-6d4_6_ibfk_1` FOREIGN KEY (`toy_id`) REFERENCES `toys` (`toy_id`))  

sotto ci sono le DESC di entrambe le tabelle:

Tabella 1:

FIELD  TYPE  NULL KEY  EXTRA 
toy_id  int(11) NO  PRI  auto_increment 
toy varchar(50) YES   

Tabella 2:

FIELD  TYPE  NULL KEY  EXTRA 
boy_id  int(11)  NO  PRI  auto_increment 
boy   varchar(50) YES 

E questa è la query ALTER stavo cercando di realizzare:

ALTER TABLE boys 
    ADD COLUMN toy_id INT NOT NULL, 
    ADD CONSTRAINT toys_toy_id_fk 
    FOREIGN KEY(toy_id) 
    REFERENCES toys(toy_id); 

Ho guardato tutto cercando di capirlo, ma senza fortuna. Grazie in anticipo, e si prega di essere gentile con questa newbie :)

EDIT:

Ecco SHOW CREATE TABLE per entrambe le tabelle:

TABELLA 1:

CREATE TABLE `toys` (
     `toy_id` int(11) NOT NULL AUTO_INCREMENT, 
     `toy` varchar(50) DEFAULT NULL, 
     PRIMARY KEY (`toy_id`) 
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 

TABELLA 2:

CREATE TABLE `boys` (
     `boy_id` int(11) NOT NULL AUTO_INCREMENT, 
     `boy` varchar(50) DEFAULT NULL, 
     PRIMARY KEY (`boy_id`) 
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 
+0

Rimuovere l'ultimo 'add':' ... Aggiungi vincolo toys_toy_id_fk FOREIGN KEY (toy_id) ... ' –

+0

Ho provato a rimuovere ADD CONSTRAINT e lasciare ADD FOREIGN KEY, oltre a lasciare ADD CONSTRAINT e rimuovere "ADD" prima di FOREIGN KEY, ma ricevere lo stesso errore. – Keith

+0

Puoi pubblicare l'output di 'SHOW CREATE TABLE toys' e di' SHOW CREATE TABLE boys'? –

risposta

44

non è possibile aggiungere una colonna NOT NULL ad una tabella che ha più di zero righe, quando la colu mn è vincolato a valori che corrispondono a quelli della tabella padre e ha tuttavia solo valori NULL perché è una nuova colonna non popolata senza DEFAULT.

La soluzione alternativa è di farlo in più fasi: aggiungere la colonna, ma non dichiararla NOT NULL e non dichiarare ancora la chiave esterna.

ALTER TABLE boys 
ADD COLUMN toy_id INT; 

Poi popolarlo con dati validi che corrisponde un certo valore (s) nella tabella giocattoli.

UPDATE boys SET toy_id = ...; 

Poi modificare la colonna di essere NOT NULL, e creare il vincolo:

ALTER TABLE boys MODIFY COLUMN toy_id INT NOT NULL, 
ADD CONSTRAINT toys_toy_id_fk 
FOREIGN KEY(toy_id) 
REFERENCES toys(toy_id); 
+0

Aye, avrei dovuto notare' auto_increment = 6'. –

+0

Questo ha funzionato perfettamente, grazie mille! – Keith

Problemi correlati