Тип и определение поля внешнего ключа и ссылки должны быть одинаковыми. Это означает, что ваш внешний ключ запрещает изменение типа вашего поля.
Одно из решений было бы таким:
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;
РЕДАКТИРОВАТЬ:
добавлены блокировки выше, благодаря комментариям
Вы должны запретить запись в базу данных при этом, иначе вы рискуете проблемами целостности данных.
Я добавил блокировку записи выше
Все запросы на запись в любом другом сеансе, кроме вашего ( INSERT, UPDATE, DELETE
), будут ждать до тайм-аута или UNLOCK TABLES
; выполняется
http://dev.mysql.com/doc/refman/5.5/en/lock-tables.html
РЕДАКТИРОВАТЬ 2: OP запросил более подробное объяснение строки «Тип и определение поля внешнего ключа и ссылки должны быть одинаковыми. Это означает, что ваш внешний ключ запрещает изменение типа вашего поля».
Из Справочного руководства MySQL 5.5: Ограничения FOREIGN KEY
Соответствующие столбцы во внешнем ключе и указанном ключе должны иметь похожие внутренние типы данных внутри InnoDB, чтобы их можно было сравнивать без преобразования типа. Размер и знак целочисленных типов должны быть одинаковыми. Длина строковых типов не обязательно должна быть одинаковой. Для столбцов недвоичной (символьной) строки набор символов и сопоставление должны быть одинаковыми.