Мне нужно удалить все таблицы в базе данных, не зная их имена заранее. Типичная процедура - удалить и затем заново создать базу данных, но это не вариант. Каков наилучший способ сделать это?
Мне нужно удалить все таблицы в базе данных, не зная их имена заранее. Типичная процедура - удалить и затем заново создать базу данных, но это не вариант. Каков наилучший способ сделать это?
Ответы:
Есть простой однострочный 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
после того, как вы проверили, что он будет делать то, что вы ожидаете.
$''
заставляет bash интерпретировать последовательности с обратной косой чертой вместо буквального восприятия . '\n'
будет точно такой же \ n, как и тот, который $IFS
будет разбиваться на \ и n символов. $'\n'
будет содержать символ новой строки, 0x0D. Посмотрите здесь для получения дополнительной информации: gnu.org/software/bash/manual/bashref.html#ANSI_002dC-Quoting .
Недавно в блоге Xaprb появилась запись, в которой об этом хорошо сказано .
Это объясняет, почему использование INFORMATION_SCHEMA
не всегда хорошо, и ссылается на инструмент тех милых людей из Maatkit .
Попробуйте следующее с 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 может создать во время нормальной работы: