Удаление таблицы с назначенным внешним ключом

#mysql #sql #database

#mysql #sql #База данных

Вопрос:

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

Я пытался:

ALTER TABLE user_profile DROP f_key

и:

ALTER TABLE user_profile DROP FOREIGN KEY f_key

но ни один из них не работает. Есть идеи?

Вывод, как предложено в комментарии ниже:

 'user_profile', 'CREATE TABLE user_profile (
 user_id int(11) NOT NULL AUTO_INCREMENT,
 name varchar(30) COLLATE utf8_unicode_ci NOT NULL,
 f_key int(11) NOT NULL,
 PRIMARY KEY (user_id),
 KEY f_key (f_key),
 CONSTRAINT user_profile_ibfk_1 FOREIGN KEY (f_key) REFERENCES user_info (id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci'
  

Комментарии:

1. Какой-то вывод ошибки ?!?!

2. Что такое f_key ? Это имя ограничения или имя столбца, для которого определено ограничение FK? Пожалуйста, опубликуйте вывод SHOW CREATE TABLE user_profile .

3. @Sebi2020 ошибка Error code: 1025. Error on rename of... — казалась слишком общей для включения в мой пост.

4. Итак, имя внешнего ключа user_profile_ibfk_1 — удалите это имя!

5. @NikkiMather Отредактируйте свой вопрос, чтобы включить это. Не добавляйте это в комментарии.

Ответ №1:

Вы не можете использовать TRUNCATE таблицу, на которую ссылается внешний ключ. Представьте УСЕЧЕНИЕ как комбинацию DROP TABLE и CREATE TABLE . В вашем определении таблицы уже есть ON DELETE CASCADE , что означает, что удаленный главный ключ приведет к удалению дочерних строк. Однако TRUNCATE эти ограничения будут пропущены.

Используйте DELETE FROM user_info вместо этого.

Комментарии:

1. Имеет смысл, и это решение сработало. Спасибо.

Ответ №2:

Вы также можете сделать это:

 mysql> SET FOREIGN_KEY_CHECKS=0;
mysql> TRUNCATE TABLE user_info;
mysql> SET FOREIGN_KEY_CHECKS=1;
  

Однако, если в ней существуют какие-либо строки user_profile , зависящие от строк в user_info , то эти строки теперь будут «осиротевшими».