Der Typ und die Definition des Fremdschlüsselfelds und der Referenz müssen gleich sein. Dies bedeutet, dass Ihr Fremdschlüssel das Ändern des Feldtyps nicht zulässt.
Eine Lösung wäre folgende:
LOCK TABLES
favorite_food WRITE,
person WRITE;
ALTER TABLE favorite_food
DROP FOREIGN KEY fk_fav_food_person_id,
MODIFY person_id SMALLINT UNSIGNED;
Jetzt können Sie Ihre person_id ändern
ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;
Fremdschlüssel neu erstellen
ALTER TABLE favorite_food
ADD CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
REFERENCES person (person_id);
UNLOCK TABLES;
BEARBEITEN:
Dank Kommentaren wurden oben Sperren hinzugefügt
Währenddessen müssen Sie das Schreiben in die Datenbank nicht zulassen, da sonst Probleme mit der Datenintegrität auftreten können.
Ich habe oben eine Schreibsperre hinzugefügt
Alle Schreibanfragen in einer anderen Sitzung als Ihrer eigenen ( INSERT, UPDATE, DELETE
) warten bis zum Timeout oder UNLOCK TABLES
; ausgeführt wird
http://dev.mysql.com/doc/refman/5.5/en/lock-tables.html
EDIT 2: OP bat um eine detailliertere Erläuterung der Zeile "Der Typ und die Definition des Fremdschlüsselfelds und der Referenz müssen gleich sein. Dies bedeutet, dass Ihr Fremdschlüssel das Ändern des Feldtyps nicht zulässt."
Aus MySQL 5.5 Referenzhandbuch: FOREIGN KEY Constraints
Entsprechende Spalten im Fremdschlüssel und im referenzierten Schlüssel müssen ähnliche interne Datentypen in InnoDB aufweisen, damit sie ohne Typkonvertierung verglichen werden können. Die Größe und das Vorzeichen von Ganzzahltypen müssen identisch sein. Die Länge der Zeichenfolgentypen muss nicht gleich sein. Bei nicht-binären (Zeichen-) Zeichenfolgenspalten müssen Zeichensatz und Sortierung identisch sein.