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

134

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

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

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

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

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

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

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

Идеи?

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

Ответы:

-40

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

Otávio Décio
источник
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снова включить проверку внешнего ключа. Пока проверки отключены, таблицы можно отбросить, затем проверки снова включаются для сохранения целостности структуры таблицы.

PAT
источник
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;

MindStalker
источник
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> 
Санджай
источник