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

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

Ответ 1

Вы можете сгенерировать оператор следующим образом: 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; 

Ответ 2

Версия @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;

Этот script не будет вызывать ошибку с результатом NULL в случае, если вы уже удалили все таблицы в базе данных, добавив хотя бы одну несуществующую таблицу "dummy".

И это исправлено в случае, если у вас много таблиц.

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

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;

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

USE REPLACE_WITH_DATABASE_NAME_YOU_WANT_TO_DELETE;

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

Ответ 3

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

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

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 в конец сгенерированного script и запустите много раз, пока команда show table не приведет к пустующему набору.

Ответ 4

Вы можете отбросить database, а затем воссоздать с помощью следующего: -

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

Ответ 5

Принятый ответ не работает для баз данных с большим количеством таблиц, например. Базы данных Drupal. Вместо этого см. script здесь: fooobar.com/info/28559/... который работает на MySQL 5.5. ПРЕДУПРЕЖДЕНИЕ. Вокруг строки 11 есть "WHERE table_schema = SCHEMA();" Вместо этого это должно быть "WHERE table_schema =" INSERT NAME OF DB, в который ИМПОРТ ПРОИСХОДИТ ";