Le type et la définition du champ et de la référence de la clé étrangère 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 :
LOCK TABLES
favorite_food WRITE,
person WRITE;
ALTER TABLE favorite_food
DROP FOREIGN KEY fk_fav_food_person_id,
MODIFY person_id SMALLINT UNSIGNED;
Maintenant vous pouvez changer votre person_id
ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;
recréer une clé étrangère
ALTER TABLE favorite_food
ADD CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
REFERENCES person (person_id);
UNLOCK TABLES;
EDIT : Ajouté les serrures ci-dessus, grâce aux commentaires
Vous devez interdire l'écriture dans la base de données pendant que vous faites cela, sinon vous risquez des problèmes d'intégrité des données.
J'ai ajouté un verrou d'écriture ci-dessus
Toutes les requêtes d'écriture dans une autre session que la vôtre ( INSERT, UPDATE, DELETE
) attendra jusqu'à ce que le délai d'attente ou UNLOCK 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 la clé étrangère et de la référence doivent être égaux. Cela signifie que votre clé étrangère interdit de modifier le type de votre champ."
Desde Manuel de référence de MySQL 5.5 : Contraintes FOREIGN KEY
Les colonnes correspondantes dans la clé étrangère et la clé référencée doivent avoir des types de données internes similaires dans InnoDB afin qu'elles puissent être comparées sans conversion de type. La taille et le signe des types entiers doivent être les mêmes. La longueur des types de chaînes de caractères ne doit pas être la même. Pour colonnes de chaînes de caractères non binaires, le jeu de caractères et la collation doivent être les mêmes.