Принудительно отбрасывать MySQL, обходя ограничение внешнего ключа - PullRequest
128 голосов
/ 20 февраля 2010

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

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

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

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

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

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

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

Идеи

Ответы [ 6 ]

362 голосов
/ 20 мая 2010

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

SET foreign_key_checks = 0;
-- Drop tables
drop table ...
-- Drop views
drop view ...
SET foreign_key_checks = 1;

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

15 голосов
/ 09 января 2015

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

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

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

3 голосов
/ 20 февраля 2010

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

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

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

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

source dump.sql;

0 голосов
/ 05 марта 2019

Простое решение для одновременного удаления всех столов из терминала.

Это включало несколько шагов в вашей оболочке 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> 
0 голосов
/ 20 февраля 2010

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

...