Видалення деяких зовнішніх ключів MySQL


190

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

CREATE TABLE location (
   locationID INT NOT NULL AUTO_INCREMENT PRIMARY KEY
   ...
) ENGINE = InnoDB;

CREATE TABLE assignment (
   assignmentID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
   locationID INT NOT NULL,
   FOREIGN KEY locationIDX (locationID) REFERENCES location (locationID)
   ...
) ENGINE = InnoDB;

CREATE TABLE assignmentStuff (
   ...
   assignmentID INT NOT NULL,
   FOREIGN KEY assignmentIDX (assignmentID) REFERENCES assignment (assignmentID)
) ENGINE = InnoDB;

Проблема полягає в тому, що коли я намагаюся скинути один із стовпців із зовнішнім ключем (тобто locationIDX), це дає мені помилку.

"ПОМИЛКА 1025 (HY000): Помилка перейменування"

Як я можу впустити стовпчик у таблицю присвоєнь вище, не отримуючи цієї помилки?

Відповіді:


447

Як пояснено тут , схоже, обмеження зовнішнього ключа повинно бути скинуте на ім'я обмеження, а не на ім'я індексу. Синтаксис:

alter table footable drop foreign key fooconstraint

35
Це була моя проблема. Зараз я почуваюсь німим німим. Якщо хтось інший має цю проблему, ви можете знайти імена обмежень іноземних ключів за допомогою функції SHOW CREATE TABLE.
Дрю

14
Порада: використовуйте, SHOW CREATE TABLE footable;щоб побачити, як називається обмеження. Це не назва стовпця per-se. Дякую за відповідь!
Кріс Бейкер

2
Ви можете використати це для пошуку зовнішніх ключових обмежень: SELECT * FROM information_schema.table_constraints WHERE constraint_schema = '<ваше db ім'я>' AND constraint_type = 'FOREIGN KEY'
Gayan Dasanayake

21

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

Я думаю, що наступний запит виконає це:

ALTER TABLE assignmentStuff DROP FOREIGN KEY assignmentIDX;

16

Як всі говорили вище, FK можна легко видалити. Однак я щойно помітив, що може бути необхідним скинути КЛЮЧ у якийсь момент. Якщо у вас є повідомлення про помилку, щоб створити інший індекс, як останній, я маю на увазі те саме ім’я, було б корисно скинути все, що стосується цього індексу.

ALTER TABLE your_table_with_fk
  drop FOREIGN KEY name_of_your_fk_from_show_create_table_command_result,
  drop KEY the_same_name_as_above

10

Перевірте, що ім'я CONSTRAINT та ім'я FOREIGN KEY:

SHOW CREATE TABLE table_name;

Видаліть і ім’я CONSTRAINT, і ім'я FOREIGN KEY:

ALTER TABLE table_name
  DROP FOREIGN KEY the_name_after_CONSTRAINT,
  DROP KEY the_name_after_FOREIGN_KEY;

Сподіваюся, це допомагає!


4

Ось спосіб усунути обмеження зовнішнього ключа, воно спрацює. АЛЬТЕР ТАБЛИЦЯ location. location_id DROP FOREIGN KEY location_ibfk_1;


2

Гей, я дотримувався певної послідовності вище, і знайшов якесь рішення.

SHOW CREATE TABLE footable;

Ви отримаєте FK Constrain Name на кшталт

ProjectsInfo_ibfk_1

Тепер вам потрібно усунути ці обмеження. по таблиці alter comantd

alter table ProjectsInfo drop foreign key ProjectsInfo_ibfk_1;

Потім опустіть стовпчик таблиці,

alter table ProjectsInfo drop column clientId;

1

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

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

ПОКАЗУЙТЕ СТВОРИТИ ТАБЛИЧНИЙ регіон; Це повинно показувати вам рядок, у лівому верхньому куті натисніть на кнопку +, натисніть кнопку повного тексту в районі, а потім натисніть кнопку «Перейти». Ви отримаєте назву індексу, приблизно так:

CONSTRAINT region_ibfk_1 ІНТЕРНЕТ КЛЮЧ (country_id) ДОВІДКИ країна (ідентифікатор) НА ВИДАЛЕННЯ НЕ ДІЇ НА ОНОВЛЕННЯ НЕ ДІЇ Тепер просто випустіть запитання:

змінити область випадіння таблиці на зовнішній ключ region_ibfk_1;

або

простіше просто введіть: - змінити таблицю випадіння зовнішнього ключа TableName TableName_ibfk_1 ;

пам'ятайте, єдине, що потрібно додати _ibfk_1 після свого імені таблиці, щоб зробити це так: - Табличне ім'я _ibfk_1


0

Не можна скидати стовпчик із зовнішнім ключем, оскільки на нього посилаються таблиці assignmentStuff. Тож спочатку слід скасувати обмеження зовнішнього ключа assignmentStuff.assignmentIDX.

Аналогічне питання вже ставилося тут . Перегляньте також тут, щоб отримати більше інформації.


1
Отже, оскільки в taskmentStuff посилається первинний ключ призначення, я не можу скинути стовпець locationID призначення? Це видається протилежним інтуїтивно зрозумілим.
Дрю

Здається, я змінив деякі назви стовпців, тому моя відповідь не має сенсу. Вибачте за це ...
Рональд Вілденберг


0

крок 1: show create table vendor_locations;

крок 2: ALTER TABLE vendor_locations drop foreign key vendor_locations_ibfk_1;

це працювало для мене.


0

спочатку потрібно отримати фактичне обмеження імені за допомогою цього запиту

SHOW CREATE TABLE TABLE_NAME

Цей запит призведе до обмеження назви закордонного ключа, тепер нижче запит видалить його.

ALTER TABLE TABLE_NAME DROP FOREIGN KEY COLUMN_NAME_ibfk_1

Останнє число вище назва обмеження залежить від кількості іноземних ключів у таблиці

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