El tipo y la definición del campo de clave externa y la referencia deben ser iguales. Esto significa que su clave externa no permite cambiar el tipo de su campo.
Una solución sería esta:
LOCK TABLES
favorite_food WRITE,
person WRITE;
ALTER TABLE favorite_food
DROP FOREIGN KEY fk_fav_food_person_id,
MODIFY person_id SMALLINT UNSIGNED;
Ahora puedes cambiar tu person_id
ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;
recrear la clave externa
ALTER TABLE favorite_food
ADD CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
REFERENCES person (person_id);
UNLOCK TABLES;
EDITAR:
bloqueos agregados arriba, gracias a los comentarios
Debe prohibir la escritura en la base de datos mientras hace esto, de lo contrario corre el riesgo de problemas de integridad de datos.
Agregué un bloqueo de escritura arriba
Todas las consultas de escritura en cualquier otra sesión que no sea la suya ( INSERT, UPDATE, DELETE
) esperarán hasta el tiempo de espera o UNLOCK TABLES
; es ejecutado
http://dev.mysql.com/doc/refman/5.5/en/lock-tables.html
EDICIÓN 2: OP pidió una explicación más detallada de la línea "El tipo y la definición del campo de clave externa y la referencia deben ser iguales. Esto significa que su clave externa no permite cambiar el tipo de su campo".
De MySQL 5.5 Reference Manual: FOREIGN KEY Restricciones
Las columnas correspondientes en la clave externa y la clave referenciada deben tener tipos de datos internos similares dentro de InnoDB para que puedan compararse sin una conversión de tipo. El tamaño y el signo de los tipos enteros deben ser iguales. No es necesario que la longitud de los tipos de cadenas sea la misma. Para columnas de cadenas no binarias (de caracteres), el conjunto de caracteres y la intercalación deben ser iguales.