Невозможно изменить столбец, используемый в ограничении внешнего ключа
я получил эту ошибку, когда я пытаюсь изменить мой стол.
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 ответа:
тип и определение поля внешнего ключа и ссылки должны быть равны. Это означает, что ваш внешний ключ запрещает менять тип поля.
одним из решений может быть такое:
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;
пожалуйста, не используйте это на производстве и иметь резервную копию.
когда вы устанавливаете ключи (первичные или внешние), вы устанавливаете ограничения на то, как их можно использовать, что, в свою очередь, ограничивает то, что вы можете с ними делать. Если вы действительно хотите изменить столбец, вы можете воссоздать таблицу без ограничений, хотя я бы рекомендовал против этого. Вообще говоря, если у вас есть ситуация, в которой вы хотите что-то сделать, но она заблокирована ограничением, лучше всего решить, изменив то, что вы хотите сделать, а не ограничение.