Невозможно изменить столбец, используемый в ограничении внешнего ключа


я получил эту ошибку, когда я пытаюсь изменить мой стол.

Error Code: 1833. Cannot change column 'person_id': used in a foreign key constraint 'fk_fav_food_person_id' of table 'table.favorite_food'

вот мой оператор CREATE TABLE, который успешно выполнялся.

CREATE TABLE favorite_food(
    person_id SMALLINT UNSIGNED,
    food VARCHAR(20),
    CONSTRAINT pk_favorite_food PRIMARY KEY(person_id,food),
    CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
    REFERENCES person (person_id)
);

затем я попытался выполнить это заявление, и я получил вышеуказанную ошибку.

ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;
3 68

3 ответа:

тип и определение поля внешнего ключа и ссылки должны быть равны. Это означает, что ваш внешний ключ запрещает менять тип поля.

одним из решений может быть такое:

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;

EDIT: Добавлены блокировки выше, благодаря комментариям

вы должны запретить запись в базу данных, пока вы это делаете, в противном случае вы рискуете проблемами целостности данных.

я добавил блокировку записи выше

все запросы на запись в любой другой сессии, кроме вашей собственной ( INSERT, UPDATE, DELETE ) будет ждать таймаута или UNLOCK TABLES; выполняется

http://dev.mysql.com/doc/refman/5.5/en/lock-tables.html

EDIT 2: OP попросил более подробное объяснение строки " тип и определение поля внешнего ключа и ссылки должны быть равны. Это означает, что ваш внешний ключ запрещает изменение типа поля."

С справочное руководство MySQL 5.5: ограничения внешнего ключа

соответствующие столбцы во внешнем ключе и ссылочном ключе должны имейте аналогичные внутренние типы данных внутри InnoDB, чтобы они могли быть сравнивать без преобразования типов. Размер и знак целочисленных типов должно быть одинаковым. Длина строковых типов не обязательно должна быть одинаковой. Для небинарная (символьная) строка столбцы, набор символов и параметры сортировки должно быть одинаковым.

вы можете отключить проверку внешнего ключа:

SET FOREIGN_KEY_CHECKS = 0;

/* DO WHAT YOU NEED HERE */

SET FOREIGN_KEY_CHECKS = 1;

пожалуйста, не используйте это на производстве и иметь резервную копию.

когда вы устанавливаете ключи (первичные или внешние), вы устанавливаете ограничения на то, как их можно использовать, что, в свою очередь, ограничивает то, что вы можете с ними делать. Если вы действительно хотите изменить столбец, вы можете воссоздать таблицу без ограничений, хотя я бы рекомендовал против этого. Вообще говоря, если у вас есть ситуация, в которой вы хотите что-то сделать, но она заблокирована ограничением, лучше всего решить, изменив то, что вы хотите сделать, а не ограничение.