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
Проверьте, что является именем 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;
Надеюсь это поможет!
Привет, я выполнил некоторую последовательность выше и нашел решение.
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;
Вот способ снять ограничение внешнего ключа, это будет работать.
ALTER TABLE location
,location_id
ОТКЛЮЧИТЬ ИНОСТРАННЫЙ КЛЮЧ location_ibfk_1
;
Сначала нужно получить фактическое имя ограничения по этому запросу
SHOW CREATE TABLE TABLE_NAME
Этот запрос приведет к ограничению имени внешнего ключа, теперь запрос ниже его отбросит.
ALTER TABLE TABLE_NAME DROP FOREIGN KEY COLUMN_NAME_ibfk_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
Шаг 1: show create table vendor_locations;
шаг 2: ALTER TABLE vendor_locations drop foreign key vendor_locations_ibfk_1;
это сработало для меня.
Попробуй это:
alter table Documents drop
FK__Documents__Custo__2A4B4B5E
Вы не можете удалить столбец внешнего ключа, потому что на него ссылаются из таблицы assignmentStuff
, Таким образом, вы должны сначала удалить ограничение внешнего ключа assignmentStuff.assignmentIDX
,
Подобный вопрос уже задавался здесь. Проверьте также здесь для получения дополнительной информации.