Yabancı anahtar alanı ve referansın türü ve tanımı eşit olmalıdır. Bu, yabancı anahtarınızın alanınızın türünü değiştirmeye izin vermediği anlamına gelir.
Çözümlerden biri şudur:
LOCK TABLES
favorite_food WRITE,
person WRITE;
ALTER TABLE favorite_food
DROP FOREIGN KEY fk_fav_food_person_id,
MODIFY person_id SMALLINT UNSIGNED;
Artık person_id kimliğinizi değiştirebilirsiniz
ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;
yabancı anahtarı yeniden oluştur
ALTER TABLE favorite_food
ADD CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
REFERENCES person (person_id);
UNLOCK TABLES;
DÜZENLEME:
Yorumlar sayesinde yukarıya kilitler eklendi
Bunu yaparken veritabanına yazmaya izin vermemelisiniz, aksi takdirde veri bütünlüğü sorunları yaşarsınız.
Yukarıya bir yazma kilidi ekledim
Kendi oturumunuz dışındaki herhangi bir oturumdaki tüm yazma sorguları ( INSERT, UPDATE, DELETE) zaman aşımına kadar bekleyecektir veya UNLOCK TABLES; Idam edildi
http://dev.mysql.com/doc/refman/5.5/en/lock-tables.html
DÜZENLEME 2: OP, "Yabancı anahtar alanının türü ve tanımı ile referansın eşit olması gerekir. Bu, yabancı anahtarınızın alanınızın türünü değiştirmeye izin vermediği anlamına gelir." Satırının daha ayrıntılı bir açıklamasını istedi.
Gönderen YABANCI ANAHTAR Kısıtlar: 5.5 Referans Kılavuzu MySQL
Yabancı anahtardaki ve başvurulan anahtardaki karşılık gelen sütunlar, InnoDB içinde benzer dahili veri türlerine sahip olmalıdır, böylece tür dönüşümü olmadan karşılaştırılabilirler. Tam sayı türlerinin boyutu ve işareti aynı olmalıdır. Dize türlerinin uzunluğunun aynı olması gerekmez. İkili olmayan (karakter) dizgi sütunları için, karakter seti ve harmanlama aynı olmalıdır.