Я спробував це в 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)
Будь-які ідеї? Іноземні ключові речі?
Я спробував це в 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)
Будь-які ідеї? Іноземні ключові речі?
Відповіді:
Ви зазвичай отримуєте цю помилку, якщо ваші таблиці використовують двигун InnoDB. У такому випадку вам доведеться скинути зовнішній ключ, а потім зробити таблицю alter і скинути стовпець.
Але складна частина полягає в тому, що ви не можете скинути іноземний ключ, використовуючи ім'я стовпця, а замість цього вам доведеться знайти ім’я, яке використовується для його індексації. Щоб знайти це, виберіть наступне:
ПОКАЗУЙТЕ СТВОРИТИ ТАБЛИЧНИЙ регіон;
Це повинно вказувати назву індексу, приблизно так:
КОНТРОЛЬНІ ЗАМОВЛЕННЯ
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" в операторі drop. Я сподіваюсь, що це допоможе вирішити проблему, і скасує обмеження зовнішнього ключа, і ви зможете змінити стовпці таблиці та скинути таблицю.
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;
Успіхів у ваших починаннях.
У мене колись були подібні проблеми. Я видалив первинний ключ з ТАБЛИЦІ А, але коли я намагався видалити стовпець із зовнішнім ключем з таблиці BI, була показана та сама помилка.
Ви не можете скинути іноземний ключ, використовуючи ім'я стовпця, і обійти це в PHPMyAdmin або за допомогою MySQL, спочатку видаліть обмеження іноземного ключа перед перейменуванням або видаленням атрибута.
Подивіться у файл помилок для вашої бази даних mysql. За повідомленням про помилку №26305, моя квартира не дає вам справи. Ця помилка існує з MySQL 4.1 ;-)
Якщо ви використовуєте такий клієнт, як MySQL Workbench, клацніть правою кнопкою миші потрібну таблицю, з якої слід видалити іноземний ключ, а потім виберіть вкладку іноземного ключа та видаліть індекси.
Тоді ви можете запустити запит так:
alter table table_name drop foreign_key_col_name;
Напевно, існує ще одна таблиця із зовнішнім ключем, що посилається на первинний ключ, який ви намагаєтесь змінити.
Щоб дізнатися, яка таблиця викликала помилку, можна запустити, 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;
Робимо
SET FOREIGN_KEY_CHECKS=0;
перед операцією також можна зробити трюк.
Я б здогадався, що проблема з обмеженням іноземних ключів. Чи використовується країна_id як зовнішній ключ в іншій таблиці?
Я не гуру БД, але я думаю, що я вирішив подібну проблему (де було обмеження у fk), видаливши fk, зробивши свої зміни в таблиці таблиці, а потім переробивши fk речі.
Мені буде цікаво почути, який результат - колись mysql є досить загадковим.
У моєму випадку я використовував робочий стіл MySQL і зіткнувся з тією ж проблемою, опускаючи один із моїх стовпців у таблицю. Я не зміг знайти назву іноземного ключа. Я вирішив такі кроки, щоб вирішити проблему:
Rt натисніть на вашу схему та виберіть "Інспектор схеми". Це дає вам різні таблиці, стовпці, покажчики, ect.
Перейдіть на вкладку під назвою "Індекси" та знайдіть ім'я стовпця під стовпцем "Стовпець". Щойно знайдено, перевірте назву таблиці для цього запису під назвою стовпця "Таблиця". Якщо вона відповідає назві потрібної таблиці, тоді запишіть назву зовнішнього ключа із стовпця "Ім'я".
Тепер виконайте запит: ALTER table tableNamexx DROP KEY ForeignKeyName;
Тепер ви можете виконати операцію drop, яка буде успішно виконана.
Я отримав цю помилку з MySQL 5.6, але вона не мала нічого спільного із зовнішніми ключами. Це було на машині Windows 7 Professional, яка виступала сервером у невеликій локальній мережі.
Клієнтська програма робила пакетну операцію, яка створює таблицю, заповнює її деякими зовнішніми даними, після чого запускає запит, з'єднуючись з постійними таблицями, після чого скидає "тимчасову" таблицю. Ця партія робить це приблизно 300 разів, і цей конкретний звичайний запуск виконується тиждень у тиждень протягом декількох років, коли раптом ми отримуємо помилку 1025 Неможливо перейменувати проблему у випадковій точці партії.
У моєму випадку програма використовувала 4 заяви DDL. CREATE TABLE, а потім 3 CREATE INDEX. Зовнішнього ключа немає. Однак насправді створюються лише 2 індекси, а фактичний файл .frm таблиці перейменований у момент відмови.
Моє рішення полягало в тому, щоб позбутися окремих операторів CREATE INDEX та створити їх за допомогою оператора CREATE TABLE. Це на момент написання запитання вирішило для мене питання і моя допомога, коли хтось чухає голову, коли вони знаходять цю нитку.
povpreRatings = FOREACH групуютьсяRatings GENERATE group AS movieID, AVG (ratings.rating) AS avgRating, COUNT (ratings.rating) AS numRatings;
Якщо ви використовуєте будь-яку команду, як вище, ви повинні використовувати групу малими літерами. Це може вирішити вашу проблему, це вирішило мою. Принаймні, у сценарії PIG.