Il tipo e la definizione del campo e del riferimento della chiave esterna devono essere uguali. Ciò significa che la tua chiave esterna non consente la modifica del tipo di campo.
Una soluzione potrebbe essere questa:
LOCK TABLES
favorite_food WRITE,
person WRITE;
ALTER TABLE favorite_food
DROP FOREIGN KEY fk_fav_food_person_id,
MODIFY person_id SMALLINT UNSIGNED;
Ora puoi cambiare person_id
ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;
ricrea la chiave esterna
ALTER TABLE favorite_food
ADD CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
REFERENCES person (person_id);
UNLOCK TABLES;
EDIT:
Aggiunti blocchi sopra, grazie ai commenti
Durante questa operazione è necessario impedire la scrittura nel database, altrimenti si rischiano problemi di integrità dei dati.
Ho aggiunto un blocco in scrittura sopra
Tutte le query di scrittura in qualsiasi altra sessione diversa dalla tua ( INSERT, UPDATE, DELETE
) aspetteranno fino al timeout o UNLOCK TABLES
; viene eseguito
http://dev.mysql.com/doc/refman/5.5/en/lock-tables.html
EDIT 2: OP ha chiesto una spiegazione più dettagliata della riga "Il tipo e la definizione del campo e del riferimento della chiave esterna devono essere uguali. Ciò significa che la tua chiave esterna non consente la modifica del tipo del tuo campo."
Da MySQL 5.5 Reference Manual: FOREIGN KEY Constraints
Le colonne corrispondenti nella chiave esterna e nella chiave a cui si fa riferimento devono avere tipi di dati interni simili all'interno di InnoDB in modo che possano essere confrontati senza una conversione del tipo. La dimensione e il segno dei tipi interi devono essere gli stessi. La lunghezza dei tipi di stringa non deve essere la stessa. Per le colonne di stringhe non binarie (caratteri), il set di caratteri e le regole di confronto devono essere gli stessi.