Comment ajouter une clé étrangère (MySQL)
Je suis extrêmement nouveau dans SQL et j'essaie d'effectuer une simple TABLE ALTER 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 être 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`))
Ci-dessous sont les 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 c'est 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 regardé partout en essayant de comprendre, mais sans chance. Merci d'avance, et soyez 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
1 réponses
Vous ne pouvez pas ajouter une colonne NOT NULL à une table qui a plus de zéro lignes, lorsque la colonne est contrainte à des valeurs qui correspondent à celles de la table parent, et n'a que des valeurs NULL car il s'agit d'une nouvelle colonne non peuplée sans défaut.
La solution 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;
Puis remplissez-le avec des données valides qui correspondent à certaines valeurs dans vos jouets table.
UPDATE boys SET toy_id = ...;
Ensuite, modifiez la colonne pour QU'elle ne soit pas nulle 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);