Назад | Перейти на главную страницу

Как удалить все таблицы в базе данных MySQL, не удаляя базу данных?

Мне нужно удалить все таблицы в базе данных, не зная заранее их имен. Типичная процедура - удалить, а затем воссоздать базу данных, но это не вариант. Как лучше всего это сделать?

Существует более простой однострочник bash с использованием mysqldump (из Блог Thingy Ma Jig).

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

Если вы получаете эту ошибку:

ERROR 1217 (23000) at line 1: Cannot delete or update a parent row: 
    a foreign key constraint fails

Попробуйте следующее:

(echo 'SET foreign_key_checks = 0;'; 
 (mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | 
     grep ^DROP); 
 echo 'SET foreign_key_checks = 1;') | \
    mysql -u[USERNAME] -p[PASSWORD] -b [DATABASE]

Теперь он игнорирует ограничения.

Вы должны использовать information_schema таблицы, чтобы получить метаданные о базе данных, а затем отбросить перечисленные там таблицы.

Вы также можете попробовать быстрый сценарий оболочки, чтобы сделать это:

#!/bin/bash

IFS=$'\n'
for table in `mysql <databaseName> -N -e 'show tables'`; do
    echo mysql <databaseName> -e "drop table $table"
done

удалять echo после того, как вы проверите, что он будет делать то, что вы ожидаете.

Это был запись в блоге Xaprb недавно, что хорошо освещает это.

Он включает в себя, почему использование INFORMATION_SCHEMA не всегда хорошо и ссылается на инструмент от милых людей из Мааткит.

Попробуйте следующее с mk-find:

mk-find '<database>' --printf 'DROP TABLE %D.%N'

Если вас устраивают результаты, тогда:

mk-find '<database>' --exec 'DROP TABLE %D.%N'

Если у вас есть доступ к файловой системе, просто rm -rf databasename/* :).

Оператор Drop database делает то же самое ... Выдержка из руководства MySQL:

Оператор DROP DATABASE удаляет из указанного каталога базы данных те файлы и каталоги, которые MySQL может создать во время нормальной работы: