Принудительно отбрасывать MySQL, обходя ограничение внешнего ключа


134

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

Невозможно удалить или обновить родительскую строку: ограничение внешнего ключа не выполнено

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

Google нацелил меня на какой-то сайт, который предложил следующий метод:

mysql> SET foreign_key_checks = 0;
mysql> drop table ...
mysql> SET foreign_key_checks = 1;

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

База данных 4.1, поэтому я не могу использовать DROP DATABASE

Идеи?


1
Почему вы выбрали выбранный ответ, который даже не дает решения для вашего вопроса?
— Санджай

Ответы:


-40

Поскольку вы не заинтересованы в сохранении каких-либо данных, удалите всю базу данных и создайте новую.


3
О, боже, теперь я чувствую себя так глупо, я
— заменял

13
это не ответ
— фрилансер

8
Весело видеть, что этот ответ получил галочку и голосов
— tom10271

4
@RobertPounder, который был именно моей целью, и с тех пор, как я присоединился к этому сайту. Я ценю вашу точку зрения.
— Otávio Décio

3
@RobertPounder SO - это нечто большее, чем просто помощь OP, это сводится к поиску ресурса «как», я попал в эту тему, потому что мне нужно было отключить проверки ограничений внешнего ключа, и Google привел меня сюда. Я рад, что удаление базы данных было хорошим обходным путем для OP, но ответ ниже на самом деле правильный для вопроса «Принудительное отбрасывание mysql в обход ограничения внешнего ключа».
— Вэл Редченко

404

Это может быть полезно для кого-то, кто попал сюда из поиска. Убедитесь, что вы пытаетесь сбросить таблицу, а не представление .

SET foreign_key_checks = 0;
- Drop таблицы
сбросить таблицу ...
- падение просмотров
падение зрения ...
SET foreign_key_checks = 1;

SET foreign_key_checks = 0отключить проверку внешнего ключа, а затем SET foreign_key_checks = 1снова включить проверку внешнего ключа. Пока проверки отключены, таблицы можно отбросить, затем проверки снова включаются для сохранения целостности структуры таблицы.


43
Пэт мой друг!
— SeanDowney

5
Это лучший правильный ответ. Решает проблему, удаляя ли все таблицы или только несколько. Потрясающе!
— Люк Стивенсон

@PAT Большое спасибо, это сработало. хотя это не могло работать в браузере Mysql Query. Ты спас мой день.
— Mann

работал отлично, я использовал это, потому что я не могу удалить всю базу данных
— Пабло Пазос

1
Я согласен, что обычно это правильное решение, но @johnnyArt, который задал вопрос, специально исключил это как жизнеспособный вариант, потому что он не работал для него. Так что кажется, что это не правильный ответ на оригинальный вопрос, не так ли?
— Дэвид

18

Если вы используете phpmyadmin, то эта функция уже есть.

  • Выберите таблицы, которые вы хотите отбросить
  • В раскрывающемся списке внизу таблицы выберите пункт drop
  • Откроется новая страница с флажком внизу, говорящим «Проверка внешнего ключа», снимите этот флажок.
  • Подтвердите удаление, приняв «да».

3
Вы спасли мой день! Спасибо! Работал как шарм!
— Ками

4

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


Это дубликат ответа с наибольшим количеством голосов, который был опубликован четыре года назад.
— 25

3

Удаление базы данных существует во всех версиях MySQL. Но если вы хотите сохранить структуру таблицы, вот идея

mysqldump --no-data --add-drop-database --add-drop-таблица -hHOSTNAME -uUSERNAME -p> dump.sql

Это программа, а не команда mysql

Затем войдите в MySQL и

исходный дамп.sql;


1

Простое решение, чтобы сбросить все таблицы сразу из терминала.

Это включало несколько шагов в вашей оболочке mysql (хотя это не одношаговое решение), это сработало и спасло мой день.

Работал для версии сервера: 5.6.38 MySQL Community Server (GPL)

Шаги, за которыми я следовал:

 1. generate drop query using concat and group_concat.
 2. use database
 3. turn off / disable foreign key constraint check (SET FOREIGN_KEY_CHECKS = 0;), 
 4. copy the query generated from step 1
 5. re enable foreign key constraint check (SET FOREIGN_KEY_CHECKS = 1;)
 6. run show table

Оболочка MySQL

$ mysql -u root -p
Enter password: ****** (your mysql root password)
mysql> SYSTEM CLEAR;
mysql> SELECT CONCAT('DROP TABLE IF EXISTS `', GROUP_CONCAT(table_name SEPARATOR '`, `'), '`;') AS dropquery FROM information_schema.tables WHERE table_schema = 'emall_duplicate';
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| dropquery                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| DROP TABLE IF EXISTS `admin`, `app`, `app_meta_settings`, `commission`, `commission_history`, `coupon`, `email_templates`, `infopages`, `invoice`, `m_pc_xref`, `member`, `merchant`, `message_templates`, `mnotification`, `mshipping_address`, `notification`, `order`, `orderdetail`, `pattributes`, `pbrand`, `pcategory`, `permissions`, `pfeatures`, `pimage`, `preport`, `product`, `product_review`, `pspecification`, `ptechnical_specification`, `pwishlist`, `role_perms`, `roles`, `settings`, `test`, `testanother`, `user_perms`, `user_roles`, `users`, `wishlist`; |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> USE emall_duplicate;
Database changed
mysql> SET FOREIGN_KEY_CHECKS = 0;                                                                                                                                                   Query OK, 0 rows affected (0.00 sec)

// copy and paste generated query from step 1
mysql> DROP TABLE IF EXISTS `admin`, `app`, `app_meta_settings`, `commission`, `commission_history`, `coupon`, `email_templates`, `infopages`, `invoice`, `m_pc_xref`, `member`, `merchant`, `message_templates`, `mnotification`, `mshipping_address`, `notification`, `order`, `orderdetail`, `pattributes`, `pbrand`, `pcategory`, `permissions`, `pfeatures`, `pimage`, `preport`, `product`, `product_review`, `pspecification`, `ptechnical_specification`, `pwishlist`, `role_perms`, `roles`, `settings`, `test`, `testanother`, `user_perms`, `user_roles`, `users`, `wishlist`;
Query OK, 0 rows affected (0.18 sec)

mysql> SET FOREIGN_KEY_CHECKS = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW tables;
Empty set (0.01 sec)

mysql> 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.