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