2009-05-08 5 views
128

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

"ERROR 1025 (HY000): Ошибка при переименовании"

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

ответ

332

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

alter table footable drop foreign key fooconstraint 
+25

Это была моя проблема. Теперь я чувствую себя немой. Если у кого-то еще есть эта проблема, вы можете найти имена ограничений внешнего ключа, используя функцию SHOW CREATE TABLE. – Drew

+0

он работал для mee – bynu022

+5

Совет: используйте 'SHOW CREATE TABLE footable;', чтобы узнать, какое имя имеет ограничение. Это не имя столбца per se. Спасибо за ответ! –

0

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

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

+1

Таким образом, из-за первичный ключ присваивания упоминания assignmentStuff, я не могу бросить столбец locationID присваивания,? Это похоже на счетчик интуитивно понятный. – Drew

+0

Кажется, я переключил имена столбцов, поэтому мой ответ на самом деле не имеет смысла. Извините за это ... –

+0

Не беспокойтесь, помощник – Drew

20

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

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

ALTER TABLE assignmentStuff DROP FOREIGN KEY assignmentIDX; 
3

Здесь можно отбросить ограничение внешнего ключа, оно будет работать. ALTER TABLE location. location_id DROP FOREIGN KEY location_ibfk_1;

0

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

alter table Documents drop 
    FK__Documents__Custo__2A4B4B5E 
8

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

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

Надеется, что это помогает!

1

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

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

SHOW CREATE TABLE region; Это должно показать вам строку, в верхнем углу слева нажмите кнопку +, нажмите кнопку полного текста raio, затем нажмите кнопку go. Здесь вы получите название индекса, например:

CONSTRAINT region_ibfk_1 ИНОСТРАННЫЙ KEY (country_id) СПРАВОЧНАЯ ИНФОРМАЦИЯ страна (id) ВКЛ УДАЛИТЬ НЕТ ДЕЙСТВИЙ НА ОБНОВЛЕНИИ НЕТ ДЕЙСТВИЙ Теперь просто выпишите:

изменить область регионирования региона; изменить внешний регион region_ibfk_1;

или

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

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

Смежные вопросы