MySQL удаление некоторых внешних ключей

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

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 ответов


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

alter table footable drop foreign key fooconstraint

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

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

ALTER TABLE assignmentStuff DROP FOREIGN KEY assignmentIDX;

как все сказали выше, вы можете легко удалить 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

Проверьте имя ограничения и имя внешнего ключа:

SHOW CREATE TABLE table_name;

удалите как имя ограничения, так и имя внешнего ключа:

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

надеюсь, что это помогает!


вот способ отбросить ограничение внешнего ключа, он будет работать. ИЗМЕНЕНИЕ ТАБЛИЦЫ location.location_id DROP FOREIGN KEY location_ibfk_1;


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

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

показать создать область таблицы; Это должно показать вам строку ,в левом верхнем углу нажмите кнопку+, то нажмите кнопку полный текст raio и нажмите кнопку go .там вы получите название индекса, что-то вроде этого:

ограничение region_ibfk_1 внешний ключ (country_id) ссылки на страну (id) при удалении нет действия при обновлении нет действия Теперь просто вопрос:

alter TABLE region drop внешний ключ region_ibfk_1;

или

больше просто тип:- ALTER table TableName drop внешний ключ TableName_ibfk_1;

помните, что единственное, что нужно добавить _ibfk_1 после вашего tablename сделать так: - TableName_ibfk_1


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

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


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

alter table Documents drop
  FK__Documents__Custo__2A4B4B5E

Шаг 1: show create table vendor_locations;

Шаг 2: ALTER TABLE vendor_locations drop foreign key vendor_locations_ibfk_1;

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