MySQL, удаление некоторых внешних ключей - PullRequest
169 голосов
/ 08 мая 2009

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

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): ошибка при переименовании»

Как я могу удалить столбец в таблице назначений выше, не получая эту ошибку?

Ответы [ 9 ]

408 голосов
/ 08 мая 2009

Как объяснено здесь , кажется, что ограничение внешнего ключа должно быть отброшено именем ограничения , а не именем индекса. Синтаксис:

alter table footable drop foreign key fooconstraint
21 голосов
/ 08 мая 2009

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

Я думаю, что следующий запрос сделает это:

ALTER TABLE assignmentStuff DROP FOREIGN KEY assignmentIDX;
14 голосов
/ 03 января 2016

Как все говорили выше, вы можете легко удалить 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
8 голосов
/ 22 января 2017

Проверьте, что такое имя 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;

Надеюсь, это поможет!

3 голосов
/ 05 мая 2014

Вот способ снять ограничение внешнего ключа, это будет работать. ALTER TABLE location. location_id КАПЛЯТЬ ИНОСТРАННЫЙ КЛЮЧ location_ibfk_1;

1 голос
/ 09 августа 2017

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

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

ПОКАЗАТЬ CREATE TABLE регион; Это должно показать вам строку, в левом верхнем углу нажмите опцию +, нажмите полнотекстовую кнопку raio, затем нажмите go. Там вы получите название индекса, что-то вроде этого:

CONSTRAINT region_ibfk_1 FOREIGN KEY (country_id) ССЫЛКИ country (id) ВКЛ УДАЛИТЬ НЕТ ДЕЙСТВИЙ, ОБНОВЛЕНИЕ НЕТ ДЕЙСТВИЙ Теперь просто введите:

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

или

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

помните, что единственное, что нужно добавить _ibfk_1 после имени таблицы, сделать так: - TableName _ibfk_1

0 голосов
/ 31 июля 2018

шаг1: show create table vendor_locations;

step2: ALTER TABLE vendor_locations drop foreign key vendor_locations_ibfk_1;

это сработало для меня.

0 голосов
/ 24 октября 2015

Попробуйте это:

alter table Documents drop
  FK__Documents__Custo__2A4B4B5E
0 голосов
/ 08 мая 2009

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

Подобный вопрос уже задавался здесь . Проверьте также здесь для получения дополнительной информации.

...