Що означає помилка 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. У такому випадку вам доведеться скинути зовнішній ключ, а потім зробити таблицю alter і скинути стовпець.

Але складна частина полягає в тому, що ви не можете скинути іноземний ключ, використовуючи ім'я стовпця, а замість цього вам доведеться знайти ім’я, яке використовується для його індексації. Щоб знайти це, виберіть наступне:

ПОКАЗУЙТЕ СТВОРИТИ ТАБЛИЧНИЙ регіон;

Це повинно вказувати назву індексу, приблизно так:

КОНТРОЛЬНІ ЗАМОВЛЕННЯ 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і шукати розділ ПОСЛІДНА ІНТЕРНЕТНА КЛЮЧОВА ПОМИЛКА, в якому є деталі про те, що не так.

У вашому випадку, швидше за все, це щось спричиняє посилання на стовпець 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)
letsjump

7

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

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;

Успіхів у ваших починаннях.


Були проблеми з встановленням жовтняcms на xampp, нарешті, це допомогло.
jahackbeth

2

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

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


1

Подивіться у файл помилок для вашої бази даних mysql. За повідомленням про помилку №26305, моя квартира не дає вам справи. Ця помилка існує з 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 категорії, щоб показати ім'я обмеження.

Найімовірніше, це буде категорії_ibfk_1

Використовуйте ім'я, щоб спочатку видалити іноземний ключ, а потім стовпець:

ALTER TABLE categories DROP FOREIGN KEY categories_ibfk_1;
ALTER TABLE categories DROP COLUMN assets_id;


0

Я б здогадався, що проблема з обмеженням іноземних ключів. Чи використовується країна_id як зовнішній ключ в іншій таблиці?

Я не гуру БД, але я думаю, що я вирішив подібну проблему (де було обмеження у fk), видаливши fk, зробивши свої зміни в таблиці таблиці, а потім переробивши fk речі.

Мені буде цікаво почути, який результат - колись mysql є досить загадковим.


Mysql може бути жахливим. Добре зазвичай, але ті повідомлення про помилки, шееш. Якщо ми отримаємо стисле пояснення від когось в офісі, я підкину його сюди.
Трентон

0

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

  1. Rt натисніть на вашу схему та виберіть "Інспектор схеми". Це дає вам різні таблиці, стовпці, покажчики, ect.

  2. Перейдіть на вкладку під назвою "Індекси" та знайдіть ім'я стовпця під стовпцем "Стовпець". Щойно знайдено, перевірте назву таблиці для цього запису під назвою стовпця "Таблиця". Якщо вона відповідає назві потрібної таблиці, тоді запишіть назву зовнішнього ключа із стовпця "Ім'я".

  3. Тепер виконайте запит: ALTER table tableNamexx DROP KEY ForeignKeyName;

  4. Тепер ви можете виконати операцію drop, яка буде успішно виконана.


0

Я отримав цю помилку з MySQL 5.6, але вона не мала нічого спільного із зовнішніми ключами. Це було на машині Windows 7 Professional, яка виступала сервером у невеликій локальній мережі.

Клієнтська програма робила пакетну операцію, яка створює таблицю, заповнює її деякими зовнішніми даними, після чого запускає запит, з'єднуючись з постійними таблицями, після чого скидає "тимчасову" таблицю. Ця партія робить це приблизно 300 разів, і цей конкретний звичайний запуск виконується тиждень у тиждень протягом декількох років, коли раптом ми отримуємо помилку 1025 Неможливо перейменувати проблему у випадковій точці партії.

У моєму випадку програма використовувала 4 заяви DDL. CREATE TABLE, а потім 3 CREATE INDEX. Зовнішнього ключа немає. Однак насправді створюються лише 2 індекси, а фактичний файл .frm таблиці перейменований у момент відмови.

Моє рішення полягало в тому, щоб позбутися окремих операторів CREATE INDEX та створити їх за допомогою оператора CREATE TABLE. Це на момент написання запитання вирішило для мене питання і моя допомога, коли хтось чухає голову, коли вони знаходять цю нитку.


-2

povpreRatings = FOREACH групуютьсяRatings GENERATE group AS movieID, AVG (ratings.rating) AS avgRating, COUNT (ratings.rating) AS numRatings;

Якщо ви використовуєте будь-яку команду, як вище, ви повинні використовувати групу малими літерами. Це може вирішити вашу проблему, це вирішило мою. Принаймні, у сценарії PIG.


Я не думаю, що це пов'язано з проблемою, він або вона зачіпає проблему mysql
Zdenek Machek
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.