Ответ 1
Тип и определение поля внешнего ключа и ссылки должны быть равны. Это означает, что ваш внешний ключ запрещает изменять тип вашего поля.
Одним из решений было бы следующее:
LOCK TABLES
favorite_food WRITE,
person WRITE;
ALTER TABLE favorite_food
DROP FOREIGN KEY fk_fav_food_person_id,
MODIFY person_id SMALLINT UNSIGNED;
Теперь вы можете изменить you 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;
EDIT: Добавлены блокировки выше, благодаря комментариям
Вы должны запретить запись в базу данных, пока вы это делаете, в противном случае вы рискуете проблемы с целостностью данных.
Я добавил блокировку записи выше
Все записи запросов в любом другом сеансе, кроме вашего собственного (INSERT, UPDATE, DELETE
), будут ждать до таймаута или UNLOCK TABLES
; выполняется
http://dev.mysql.com/doc/refman/5.5/en/lock-tables.html
EDIT 2: OP запросил более подробное объяснение строки "Тип и определение поля внешнего ключа и ссылки должны быть равными. Это означает, что ваш внешний ключ запрещает изменять тип вашего поля".
Из Справочное руководство MySQL 5.5: ограничения FOREIGN KEY
Соответствующие столбцы внешнего ключа и ссылочного ключа должны имеют аналогичные внутренние типы данных внутри InnoDB, так что они могут быть сравниваются без преобразования типа. Размер и знак целочисленных типов должны быть одинаковыми. Длина типов строк не обязательно должна быть одинаковой. Для небинные (символьные) строковые столбцы, набор символов и сортировка должны быть одинаковыми.