Vì các khóa ngoại phải khớp với kiểu dữ liệu của cột mà chúng tham chiếu, nên việc thay đổi kiểu dữ liệu của cột có thể làm đảo lộn khóa ngoại tham chiếu đến nó.
Có vẻ như MySQL có biện pháp bảo vệ chống lại điều này và từ chối nỗ lực SỬA ĐỔI cột. Nhưng nó không đủ thông minh để kiểm tra xem liệu sửa đổi cụ thể bạn đang thực hiện có thực sự thay đổi kiểu dữ liệu hay không. Nó chỉ phủ nhận mọi nỗ lực sửa đổi cột đó.
Bạn có thể giải quyết vấn đề này bằng cách tạm thời tắt kiểm tra khóa ngoại. Tôi đã tạo lại bảng của bạn và xác nhận nó:
mysql> ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;
ERROR 1833 (HY000): Cannot change column 'person_id': used in a foreign key constraint 'favorite_food_ibfk_1' of table 'test.favorite_food'
mysql> set foreign_key_checks=0;
Query OK, 0 rows affected (0.00 sec)
mysql> ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;
Query OK, 0 rows affected (0.08 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> set foreign_key_checks=1;