web-dev-qa-db-fra.com

Comment ajouter une clé étrangère (MySQL)

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
31
Keith

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);
45
Bill Karwin