Мне нужно удалить все таблицы в базе данных, не зная заранее их имен. Типичная процедура - удалить, а затем воссоздать базу данных, но это не вариант. Как лучше всего это сделать?
Существует более простой однострочник 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 может создать во время нормальной работы: