Как удалить все таблицы MySQL из командной строки без разрешения на удаление базы данных? [дубликат]

этот вопрос уже есть ответ здесь:

Как удалить все таблицы в Windows MySQL, используя командную строку? Причина, по которой я хочу это сделать, заключается в том, что у нашего пользователя есть доступ к базе данных, но нет доступа к повторному созданию самой базы данных для этого поэтому мы должны отбросить таблицы вручную. Есть ли способ бросить все столы сразу? Имейте в виду, что большинство таблиц связаны с внешними ключами, поэтому они должны быть удалены в определенном порядке.

5 ответов


вы можете сгенерировать такой оператор:DROP TABLE t1, t2, t3, ... а затем используйте подготовленные операторы для его выполнения:

SET FOREIGN_KEY_CHECKS = 0; 
SET @tables = NULL;
SELECT GROUP_CONCAT(table_schema, '.', table_name) INTO @tables
  FROM information_schema.tables 
  WHERE table_schema = 'database_name'; -- specify DB name here.

SET @tables = CONCAT('DROP TABLE ', @tables);
PREPARE stmt FROM @tables;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1; 

версия @Devart верна, но вот некоторые улучшения, чтобы избежать ошибок. Я отредактировал ответ @Devart, но он не был принят.

SET FOREIGN_KEY_CHECKS = 0;
SET GROUP_CONCAT_MAX_LEN=32768;
SET @tables = NULL;
SELECT GROUP_CONCAT('`', table_name, '`') INTO @tables
  FROM information_schema.tables
  WHERE table_schema = (SELECT DATABASE());
SELECT IFNULL(@tables,'dummy') INTO @tables;

SET @tables = CONCAT('DROP TABLE IF EXISTS ', @tables);
PREPARE stmt FROM @tables;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;

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

и это фиксируется в случае, когда у вас есть много таблиц.

и это небольшое изменение, чтобы отбросить все представления, существует в База данных

SET FOREIGN_KEY_CHECKS = 0;
SET GROUP_CONCAT_MAX_LEN=32768;
SET @views = NULL;
SELECT GROUP_CONCAT('`', TABLE_NAME, '`') INTO @views
  FROM information_schema.views
  WHERE table_schema = (SELECT DATABASE());
SELECT IFNULL(@views,'dummy') INTO @views;

SET @views = CONCAT('DROP VIEW IF EXISTS ', @views);
PREPARE stmt FROM @views;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;

предполагается, что вы запускаете скрипт из базы данных, которую вы хотите удалить. Или запустите это раньше:

USE REPLACE_WITH_DATABASE_NAME_YOU_WANT_TO_DELETE;

спасибо Стиву хорвату, чтобы обнаружить проблему с backticks.


попробуйте это.

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

mysqldump -u[USERNAME] -p[PASSWORD] \
  --add-drop-table --no-data [DATABASE] | \
  grep -e '^DROP \| FOREIGN_KEY_CHECKS' | \
  mysql -u[USERNAME] -p[PASSWORD] [DATABASE]

чтобы преодолеть эффекты проверки внешнего ключа, добавьте show table в конце сгенерированного скрипта и запустить много раз, пока show table команда приводит к пустому набору.


Вы можете падение на database а то заново это с ниже: -

mysql> drop database [database name];
mysql> create database [database name];

принятый ответ не работает для баз данных с большим количеством таблиц, например баз данных Drupal. Вместо этого смотрите сценарий здесь:https://stackoverflow.com/a/12917793/1507877 который работает на MySQL 5.5. Внимание: вокруг строки 11 есть "где table_schema = SCHEMA ();" это должно быть "где table_schema =' вставить имя БД, в которую будет происходить импорт";"