O tipo e a definição do campo de chave estrangeira e a referência devem ser iguais. Isso significa que sua chave estrangeira não permite a alteração do tipo de seu campo.
Uma solução seria 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;
Agora você pode mudar sua person_id
ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;
recriar chave estrangeira
ALTER TABLE favorite_food
ADD CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
REFERENCES person (person_id);
UNLOCK TABLES;
EDITAR:
bloqueios adicionados acima, graças aos comentários
Você deve proibir a gravação no banco de dados enquanto faz isso, caso contrário, corre o risco de problemas de integridade de dados.
Eu adicionei um bloqueio de gravação acima
Todas as consultas de escrita em qualquer outra sessão que não a sua ( INSERT, UPDATE, DELETE) irão esperar até o tempo limite ou UNLOCK TABLES; É executado
http://dev.mysql.com/doc/refman/5.5/en/lock-tables.html
EDIT 2: OP pediu uma explicação mais detalhada da linha "O tipo e definição de campo de chave estrangeira e referência devem ser iguais. Isso significa que sua chave estrangeira não permite alterar o tipo de seu campo."
Do MySQL 5.5 Reference Manual: FOREIGN KEY Constraints
As colunas correspondentes na chave estrangeira e na chave referenciada devem ter tipos de dados internos semelhantes dentro do InnoDB para que possam ser comparadas sem uma conversão de tipo. O tamanho e o sinal dos tipos inteiros devem ser os mesmos. O comprimento dos tipos de string não precisa ser o mesmo. Para colunas de string não binárias (caracteres), o conjunto de caracteres e o agrupamento devem ser os mesmos.