Je suis extrêmement nouveau dans SQL et j'essaie d'effectuer une simple ALTER TABLE pour créer une nouvelle colonne et l'utiliser comme clé étrangère pour référencer une autre table simple dans ma base de données. J'ai modifié les deux tables pour qu'elles deviennent InnoDB
Cependant, lors de l'exécution du code ALTER TABLE, j'obtiens l'erreur suivante:
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`))
Voici le DESC des deux tableaux:
Tableau 1:
FIELD TYPE NULL KEY EXTRA
toy_id int(11) NO PRI auto_increment
toy varchar(50) YES
Tableau 2:
FIELD TYPE NULL KEY EXTRA
boy_id int(11) NO PRI auto_increment
boy varchar(50) YES
Et voici la requête ALTER que j'essayais d'effectuer:
ALTER TABLE boys
ADD COLUMN toy_id INT NOT NULL,
ADD CONSTRAINT toys_toy_id_fk
FOREIGN KEY(toy_id)
REFERENCES toys(toy_id);
J'ai cherché partout pour comprendre, mais sans succès. Merci à l'avance et veuillez être gentil avec ce débutant :)
MODIFIER:
Voici le SHOW CREATE TABLE pour les deux tables:
TABLEAU 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
TABLEAU 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
Vous ne pouvez pas ajouter une colonne NOT NULL à une table qui contient plus de zéro lignes, lorsque la colonne est limitée à des valeurs qui correspondent à celles de la table parent, et n'a cependant que des valeurs NULL car il s'agit d'une nouvelle colonne non peuplée sans DEFAULT .
La solution de contournement consiste à le faire par étapes: ajoutez la colonne, mais ne la déclarez PAS NON NULL et ne déclarez pas encore la clé étrangère.
ALTER TABLE boys
ADD COLUMN toy_id INT;
Remplissez-le ensuite avec des données valides qui correspondent à une ou plusieurs valeurs dans votre table de jouets.
UPDATE boys SET toy_id = ...;
Modifiez ensuite la colonne pour qu'elle ne soit PAS NULL et créez la contrainte:
ALTER TABLE boys MODIFY COLUMN toy_id INT NOT NULL,
ADD CONSTRAINT toys_toy_id_fk
FOREIGN KEY(toy_id)
REFERENCES toys(toy_id);