J'ai eu cette erreur lorsque j'essayais de modifier ma table.
Error Code: 1833. Cannot change column 'person_id': used in a foreign key constraint 'fk_fav_food_person_id' of table 'table.favorite_food'
Voici mon CREATE TABLE STATEMENT qui s'est exécuté avec succès.
CREATE TABLE favorite_food(
person_id SMALLINT UNSIGNED,
food VARCHAR(20),
CONSTRAINT pk_favorite_food PRIMARY KEY(person_id,food),
CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
REFERENCES person (person_id)
);
Ensuite, j'ai essayé d'exécuter cette déclaration et j'ai eu l'erreur ci-dessus.
ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;
Réponses:
Le type et la définition du champ de clé étrangère et de la référence doivent être égaux. Cela signifie que votre clé étrangère ne permet pas de modifier le type de votre champ.
Une solution serait la suivante:
Vous pouvez maintenant changer votre person_id
recréer la clé étrangère
EDIT: Ajout de verrous ci-dessus, grâce aux commentaires
J'ai ajouté un verrou d'écriture ci-dessus
Toutes les requêtes d'écriture dans une session autre que la vôtre (
INSERT, UPDATE, DELETE
) attendront jusqu'à l'expiration du délai ouUNLOCK TABLES
; est exécutéhttp://dev.mysql.com/doc/refman/5.5/en/lock-tables.html
EDIT 2: OP a demandé une explication plus détaillée de la ligne "Le type et la définition du champ de clé étrangère et de la référence doivent être égaux. Cela signifie que votre clé étrangère ne permet pas de changer le type de votre champ."
Depuis le manuel de référence de MySQL 5.5: Contraintes FOREIGN KEY
la source
person_id
juste après avoir déposé la clé étrangère? On dirait que vous n'avez rien changé car c'est déjà un fichierSMALLINT UNSIGNED
.Vous pouvez désactiver les vérifications de clé étrangère:
Veuillez vous assurer de NE PAS utiliser ceci en production et d'avoir une sauvegarde.
la source
SET FOREIGN_KEY_CHECKS
défini par la session (les autres sessions auront toujours la contrainte FK appliquée). C'est parfait pour ajouter / supprimerAUTO_INCREMENT
(ce qui ne change pas le type de données de colonne réel), mais cela ne fonctionnera pas si vous essayez de changer le type de données de colonne pour "réel" (disons, de SMALLINT à INT) car vous obtiendrez un150 FK constraint incorrectly formed
lorsque mysql essaie de remplacer l'ancienne table par la nouvelle. Dans ce cas, utilisez la réponse acceptée.Lorsque vous définissez des clés (primaires ou étrangères), vous définissez des contraintes sur la façon dont elles peuvent être utilisées, ce qui limite ce que vous pouvez en faire. Si vous voulez vraiment modifier la colonne, vous pouvez recréer la table sans les contraintes, même si je vous le déconseille. De manière générale, si vous avez une situation dans laquelle vous voulez faire quelque chose, mais qu'elle est bloquée par une contrainte, il est préférable de la résoudre en modifiant ce que vous voulez faire plutôt que la contrainte.
la source