Как удалить все таблицы 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, в который ИМПОРТ ПРОИСХОДИТ ";