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


160

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

Любые идеи? Материал внешнего ключа?


@skiphoppy - Ты пытаешься дать награду за уже предоставленный ответ? Это даже разрешено? Или ваш случай отличается, в этом случае вы должны начать другой поток?
Рик Джеймс

@RickJames Да, это так. Тем не менее, skiphoppy должен добавить свой комментарий под ответом, который она выбрала, так как сообщение о поединке исчезнет, ​​когда вознаграждение закончится.
RandomSeed

Ответы:


240

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

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

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

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

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

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

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

И, наконец,

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

И вам хорошо идти!


Обратите внимание, что вы также можете удалить внешний ключ и столбец в одном запросе ALTER TABLE;
Валентин Грегуар

отлично! мы должны бросить внешний ключ, все будет хорошо! Спасибо!
Луан Д

173

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

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

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

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


2
Снова, другая вводящая в заблуждение MySQL отображала ошибку ... Спасибо.
e2-e4

В phpMyAdmin вы можете найти статус двигателя в хранилищах , InnoDB , InnoDB Status
Maxence

15

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

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

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;

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


1
Это мне понадобилось при переключении на другой набор символов таблицы из-за ошибки mysql: ОШИБКА 1025 (HY000): Ошибка при переименовании «./table/#sql-14ae_81» в (errno: 150)
letjump

7

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

ALTER TABLE slide_image_sub DROP  KEY  FK_slide_image_sub;

здесь DROP KEYвместо того , чтобы DROP FOREIGN KEY,

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

Спасибо


4

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

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

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

SET FOREIGN_KEY_CHECKS = 0;

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

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

SET FOREIGN_KEY_CHECKS = 1;

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


Были проблемы с установкой octobercms на xampp, наконец-то это помогло.
Джекбет

2

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

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


1

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


Мне было трудно понять некоторые из ваших ответов, но +1 за ссылку на отчет об ошибке. По-видимому, теперь это исправлено в MySQL v5.6.6. :)
mwfearnley

1

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

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

alter table table_name drop foreign_key_col_name;

1

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

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


0

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

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

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


Mysql может быть ужасным. Хорошо обычно, но эти сообщения об ошибках, шееш. Если мы получим краткое объяснение от кого-то в офисе, я приведу его здесь.
Трентон

0

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

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

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

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

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


0

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

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

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

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


-2

averageRatings = FOREACH groupedRatings GENERATE группа AS movieID, AVG (ratings.rating) AS avgRating, COUNT (ratings.rating) AS numRatings;

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


Я не думаю, что это связано с проблемой, он или она сталкивается с проблемой MySQL
Зденек Мачек
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.