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;чтобы увидеть, как называется ограничение. Это не название колонки как таковой. Спасибо за ответ!
Крис Бейкер

2
Вы можете использовать это, чтобы найти ограничения внешнего ключа: SELECT * FROM information_schema.table_constraints WHERE constraint_schema = '<имя вашей базы данных>' И constraint_type = 'FOREIGN KEY'
Гаян Дасанаяке

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 и имя внешнего ключа:

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

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


4

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


2

Эй, я следовал некоторой последовательности выше и нашел какое-то решение.

SHOW CREATE TABLE footable;

Вы получите FK Constrain Name как

ProjectsInfo_ibfk_1

Теперь вам нужно убрать это ограничение. изменить таблицу Commantd

alter table ProjectsInfo drop foreign key ProjectsInfo_ibfk_1;

Затем опустите столбец таблицы,

alter table ProjectsInfo drop column clientId;

1

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

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

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

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

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

или

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

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


0

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

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


1
Итак, так как assignmentStuff ссылается на первичный ключ назначения, я не могу удалить столбец 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.