Что означает ошибка mysql 1025 (HY000): ошибка при переименовании «./foo» (errorno: 150)? - PullRequest
155 голосов
/ 02 октября 2008

Я попробовал это в MySQL:

mysql> alter table region drop column country_id;

И получил это:

ERROR 1025 (HY000): Error on rename of './product/#sql-14ae_81' to
'./product/region' (errno: 150)

Есть идеи? Материал внешнего ключа?

Ответы [ 13 ]

232 голосов
/ 11 апреля 2011

Обычно вы получаете эту ошибку, если ваши таблицы используют движок InnoDB. В этом случае вам придется удалить внешний ключ, а затем выполнить изменение таблицы и удалить столбец.

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

ПОКАЗАТЬ CREATE TABLE регион;

Это должно показать вам название индекса, примерно так:

ОГРАНИЧЕНИЕ region_ibfk_1 ИНОСТРАННЫЙ КЛЮЧ (country_id) ССЫЛКИ country (id) УДАЛИТЬ НЕТ ДЕЙСТВИЯ ОБ ОБНОВЛЕНИИ НЕТ ДЕЙСТВИЯ

Теперь просто введите:

изменить внешний ключ области таблицы region_ibfk_1;

И, наконец,:

изменить столбец удаления области таблицы country_id;

И тебе пора!

173 голосов
/ 07 октября 2008

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

shell$ perror 150
MySQL error code 150: Foreign key constraint is incorrectly formed

Чтобы узнать больше о том, что не удалось, вы можете использовать SHOW ENGINE INNODB STATUS и найти в разделе ПОСЛЕДНЯЯ ИНОСТРАННАЯ КЛЮЧЕВАЯ ОШИБКА, в котором содержится информация о том, что не так.

В вашем случае это скорее всего причина того, что что-то ссылается на столбец country_id.

14 голосов
/ 22 октября 2009

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

Если внешний ключ существует, и вы все еще получаете эту ошибку, попробуйте следующее:

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

// Удалите внешний ключ здесь!

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

Это всегда помогает мне:)

7 голосов
/ 21 февраля 2013

Просто запустите запрос на изменение таблицы, используя «KEY» вместо «FOREIGN KEY» в операторе удаления. Я надеюсь, что это поможет решить проблему, и уберет ограничение внешнего ключа, и вы сможете изменить столбцы таблицы и удалить таблицу.

ALTER TABLE slide_image_sub DROP  KEY  FK_slide_image_sub;

здесь DROP KEY вместо DROP FOREIGN KEY,

надеюсь, это поможет.

Спасибо

2 голосов
/ 09 января 2017

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

Тем не менее, есть простой «взлом» для исправления этой проблемы:

Перед выполнением команды (ей) сначала необходимо отключить проверку ограничений внешнего ключа с помощью этой команды:

SET FOREIGN_KEY_CHECKS = 0;

Тогда вы сможете выполнить свои команды.

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

SET FOREIGN_KEY_CHECKS = 1;

Удачи в ваших начинаниях.

2 голосов
/ 12 января 2016

У меня были похожие проблемы однажды. Я удалил первичный ключ из ТАБЛИЦЫ A, но когда я пытался удалить столбец внешнего ключа из таблицы B, мне показалась та же самая ошибка выше.

Вы не можете удалить внешний ключ, используя имя столбца, и чтобы обойти это в PHPMyAdmin или MySQL, сначала удалите ограничение внешнего ключа перед переименованием или удалением атрибута.

1 голос
/ 14 января 2017

Doing

SET FOREIGN_KEY_CHECKS=0;

до того, как Операция также может сделать свое дело.

1 голос
/ 11 января 2016

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

Чтобы узнать, какая таблица вызвала ошибку, вы можете запустить SHOW ENGINE INNODB STATUS, а затем просмотреть раздел LATEST FOREIGN KEY ERROR

Используйте категории SHOW CREATE TABLE, чтобы отобразить имя ограничения.

Скорее всего, это будет category_ibfk_1

Используйте имя, чтобы сначала удалить внешний ключ, а затем столбец:

ALTER TABLE categories DROP FOREIGN KEY categories_ibfk_1;
ALTER TABLE categories DROP COLUMN assets_id;
1 голос
/ 09 января 2013

Если вы используете такой клиент, как MySQL Workbench, щелкните правой кнопкой мыши нужную таблицу, из которой необходимо удалить внешний ключ, затем выберите вкладку внешнего ключа и удалите индексы.

Затем вы можете выполнить запрос следующим образом:

alter table table_name drop foreign_key_col_name;
1 голос
/ 16 марта 2010

Посмотрите файл ошибок для вашей базы данных mysql. Согласно Ошибка # 26305 мой sql не дает вам причину. Эта ошибка существует с MySQL 4.1; -)

...