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
31
demandé sur Keith 2013-03-12 01:50:22

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);
45
répondu Bill Karwin 2013-03-11 22:32:02