Тип та визначення поля закордонного ключа та посилання повинні бути однаковими. Це означає, що ваш зовнішній ключ забороняє змінювати тип вашого поля.
Одним з рішень було б таке:
LOCK TABLES
favorite_food WRITE,
person WRITE;
ALTER TABLE favorite_food
DROP FOREIGN KEY fk_fav_food_person_id,
MODIFY person_id SMALLINT UNSIGNED;
Тепер ви можете змінити ваш person_id
ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;
відтворити іноземний ключ
ALTER TABLE favorite_food
ADD CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
REFERENCES person (person_id);
UNLOCK TABLES;
EDIT:
Додано блокування вище, завдяки коментарям
Під час цього вам потрібно заборонити писати в базу даних, інакше ви ризикуєте проблемами з цілісністю даних.
Я додав блокування запису вище
Усі запити щодо запису в будь-якому іншому сеансі, крім вашого власного ( INSERT, UPDATE, DELETE), будуть чекати до тайм-ауту або UNLOCK TABLES; виконується
http://dev.mysql.com/doc/refman/5.5/uk/lock-tables.html
EDIT 2: ОП попросило більш детальне пояснення рядка "Тип та визначення поля іноземного ключа та посилання повинні бути рівними. Це означає, що ваш зовнішній ключ забороняє змінювати тип вашого поля".
З довідкового посібника MySQL 5.5: ЗНОЗОВНІ КЛЮЧІ
Відповідні стовпці в зовнішньому ключі та посилальному ключі повинні мати подібні внутрішні типи даних всередині InnoDB, щоб їх можна було порівняти без перетворення типів. Розмір і знак цілих типів повинні бути однаковими. Довжина типів рядків не повинна бути однаковою. Для небінарних (символьних) рядків стовпців набір символів та порівняння повинні бути однаковими.