Что означает ошибка mysql 1025 (HY000): ошибка при переименовании "./foo" (errorno: 150)?

Я попробовал это в 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 ответов

Решение

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

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

ПОКАЗАТЬ СОЗДАТЬ СТОЛ РЕГИОНА;

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

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

Теперь просто оформите:

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

И, наконец,

столбец удаления области таблицы альтернативного страны country_id;

И тебе хорошо идти!

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

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

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

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

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

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

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;

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

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

ALTER TABLE slide_image_sub DROP  KEY  FK_slide_image_sub;

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

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

Спасибо

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

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

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

SET FOREIGN_KEY_CHECKS = 0;

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

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

SET FOREIGN_KEY_CHECKS = 1;

Удачи в ваших усилиях.

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

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

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

Чтобы выяснить, какая таблица вызвала ошибку, вы можете запустить SHOW ENGINE INNODBSTATUS а затем посмотрите на 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;

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

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

alter table table_name drop foreign_key_col_name;

Дела

SET FOREIGN_KEY_CHECKS=0;

перед операцией тоже можно сделать свое дело.

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

Я получил эту ошибку с MySQL 5.6, но это не имеет ничего общего с внешними ключами. Это было на машине с Windows 7 Professional, действующей в качестве сервера в небольшой локальной сети.

Клиентское приложение выполняло пакетную операцию, которая создает таблицу, заполняет ее некоторыми внешними данными, затем запускает запрос, объединяющий постоянные таблицы, а затем удаляет "временную" таблицу. Этот пакет делает это приблизительно 300 раз, и эта конкретная процедура выполнялась неделя за неделей в течение нескольких лет, когда внезапно мы получаем ошибку 1025, Невозможно переименовать проблему в случайной точке в пакете.

В моем случае приложение использовало 4 оператора DDL: CREATE TABLE, затем 3 CREATE INDEX, внешнего ключа нет. Однако только 2 из этих индексов фактически создаются, и фактический файл таблицы.frm был переименован в точке сбоя.

Моим решением было избавиться от отдельных операторов CREATE INDEX и создать их с помощью оператора CREATE TABLE. Это на момент написания статьи решило проблему для меня и моей помощи, когда кто-то почесал голову, когда нашел эту ветку.

Я предполагаю, что проблема ограничения внешнего ключа. Используется ли country_id как внешний ключ в другой таблице?

Я не гуру БД, но я думаю, что решил проблему, подобную этой (где было ограничение fk), удалив fk, выполнив изменения в таблице, а затем переделав fk.

Мне будет интересно услышать, каков будет результат - иногда mysql довольно загадочен.

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

  1. Rt. щелкните по своей схеме и выберите "инспектор схемы". Это дает вам различные таблицы, столбцы, индексы и т. Д.

  2. Перейдите на вкладку с именем "Индексы" и найдите имя столбца под столбцом с именем "Столбец". Найдя, проверьте имя таблицы для этой записи под именем столбца "Таблица". Если оно соответствует имени нужной вам таблицы, запишите имя внешнего ключа из столбца с именем "Имя".

  3. Теперь выполните запрос: ALTER table tableNamexx DROP KEY foreignKeyName;

  4. Теперь вы можете выполнить оператор сброса, который будет выполнен успешно.

Average Ratings= FOREACH groupedRatings СОЗДАТЬ группу как идентификатор фильма, AVG(рейтинг.рейтинг) как средний рейтинг, COUNT(рейтинг.рейтинг) AS numRatings;

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

Другие вопросы по тегам