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

Как удалить все таблицы в 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;

Спасибо Стиву Хорвату за то, что он обнаружил проблему с кавычками.

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

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

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. Вместо этого посмотрите скрипт здесь: /questions/6108108/mysql-drop-vse-tablitsyi-ignoriruya-vneshnie-klyuchi/6108133#6108133 который работает на MySQL 5.5. ВНИМАНИЕ: Вокруг строки 11 есть "ГДЕ table_schema = SCHEMA();" Вместо этого это должно быть "WHERE table_schema = 'INSERT NAME of DB INTO, КОТОРЫЙ ИМПОРТ ПРОИЗОЙДЕТ' ';"

Другие вопросы по тегам