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:
LOCK TABLES
favorite_food WRITE,
person WRITE;
ALTER TABLE favorite_food
DROP FOREIGN KEY fk_fav_food_person_id,
MODIFY person_id SMALLINT UNSIGNED;
Vous pouvez maintenant changer votre person_id
ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;
recréer la 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 de verrous 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 session autre que la vôtre ( INSERT, UPDATE, DELETE) attendront jusqu'à l'expiration du délai 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 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
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 de pouvoir être comparées sans conversion de type. La taille et le signe des types entiers doivent être identiques. La longueur des types de chaîne n'a pas besoin d'être la même. Pour les colonnes de chaînes non binaires (caractères), le jeu de caractères et le classement doivent être identiques.