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

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


person Drew    schedule 08.05.2009    source источник


Ответы (11)


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

Синтаксис:

ALTER TABLE footable DROP FOREIGN KEY fooconstraint;
person pugmarx    schedule 08.05.2009
comment
Это была моя проблема. Я чувствую себя немного глупо. Если у кого-то еще есть эта проблема, вы можете найти имена ограничений внешнего ключа с помощью функции SHOW CREATE TABLE. - person Drew; 08.05.2009
comment
Совет: используйте SHOW CREATE TABLE footable;, чтобы узнать имя ограничения. Это не название колонки как таковой. Спасибо за ответ! - person Chris Baker; 02.09.2016
comment
Вы можете использовать это для поиска ограничений внешнего ключа: SELECT * FROM information_schema.table_constraints WHERE constraint_schema = '‹ваше имя базы данных›' AND constraint_type = 'FOREIGN KEY' - person Gayan Dasanayake; 26.08.2017

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

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

ALTER TABLE assignmentStuff DROP FOREIGN KEY assignmentIDX;
person zombat    schedule 08.05.2009

Как все сказали выше, вы можете легко удалить FK. Однако я только что заметил, что в какой-то момент может потребоваться сбросить сам KEY. Если у вас есть сообщение об ошибке для создания другого индекса, такого как последний, я имею в виду с тем же именем, было бы полезно удалить все, что связано с этим индексом.

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
person Karla Danitza Duran Memijes    schedule 03.01.2016
comment
'the_same_name_as_above' не работает. См. Ответ @norodin, у меня это сработало. - person csr-nontol; 11.12.2020

Проверьте, какое имя CONSTRAINT и имя FOREIGN KEY:

SHOW CREATE TABLE table_name;

Удалите как имя ОГРАНИЧЕНИЯ, так и имя ИНОСТРАННОГО КЛЮЧА:

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

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

person norodin    schedule 22.01.2017

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

SHOW CREATE TABLE footable;

Вы получите имя ограничения FK, например

ProjectsInfo_ibfk_1

Теперь вам нужно снять это ограничение. по alter table commantd

alter table ProjectsInfo drop foreign key ProjectsInfo_ibfk_1;

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

alter table ProjectsInfo drop column clientId;
person Community    schedule 16.10.2019

Вот способ снять ограничение внешнего ключа, он сработает. ALTER TABLE _1 _._ 2_ DROP FOREIGN KEY location_ibfk_1;

person Rock King Kirant    schedule 05.05.2014

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

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

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

ОГРАНИЧЕНИЕ region_ibfk_1 ИНОСТРАННЫЙ КЛЮЧ (country_id) ССЫЛКИ country (id) ПРИ УДАЛЕНИИ БЕЗ ДЕЙСТВИЙ ПРИ ОБНОВЛЕНИИ БЕЗ ДЕЙСТВИЙ Теперь просто введите:

изменить область таблицы отбросить внешний ключ region_ibfk_1;

or

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

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

person Abinash Hota    schedule 09.08.2017

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

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

person Ronald Wildenberg    schedule 08.05.2009
comment
Итак, поскольку assignmentStuff ссылается на первичный ключ назначения, я не могу удалить столбец locationID назначения? Это кажется противоречащим интуиции. - person Drew; 08.05.2009
comment
Кажется, я поменял имена некоторых столбцов, поэтому мой ответ не имеет смысла. Простите за это... - person Ronald Wildenberg; 08.05.2009

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

alter table Documents drop
  FK__Documents__Custo__2A4B4B5E
person Shailendra Mishra    schedule 24.10.2015

шаг1: show create table vendor_locations;

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

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

person Jyothi M    schedule 31.07.2018

сначала нужно получить фактическое имя ограничения по этому запросу

SHOW CREATE TABLE TABLE_NAME

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

ALTER TABLE TABLE_NAME DROP FOREIGN KEY COLUMN_NAME_ibfk_1

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

person Owais Akber    schedule 02.04.2020