Есть ли команда MySQL для реализации чего-то вроде “удалить таблицы, кроме t1, b2”?
Вопрос
Я хочу сохранить t1, t2 и удалить все остальные таблицы.
Решение
Вы можете использовать information_schema
чтобы найти имена таблиц и даже отформатировать результаты в виде набора DROP
заявления.
SELECT CONCAT('DROP TABLE ', TABLE_NAME, '; ')
FROM information_schema.tables
WHERE table_schema = DATABASE() AND table_name NOT IN ('foo', 'bar', 'baz');
(Тот самый DATABASE()
функция возвращает текущее значение use
база данных "d".)
Используя PREPARE
и EXECUTE
, вы могли бы даже избежать копирования и вставки и (в MySQL 5.0.13 и более поздних версиях) написать хранимую процедуру для этого.
Другие советы
Вы могли бы использовать mysqldump для генерации списка операторов DROP TABLE, отфильтровать те, которые вам не нужны, а затем передать их обратно в клиент mysql.Вот как мы это создаем
Во-первых, вот список инструкций DROP TABLE для базы данных
mysqldump -uUSERNAME -pPASSWORD--add-drop-table --no-data DATABASE| \
grep ^DROP
Теперь мы можем передать это через grep с помощью -v, чтобы инвертировать операторы match - we want, в которых не упоминаются таблицы, которые мы сохраняем (другим способом сделать это было бы --ignore-table options в mysqldump)
mysqldump -uUSERNAME -pPASSWORD--add-drop-table --no-data DATABASE| \
grep ^DROP |
grep -v 'foo\|bar'
Наконец, как только вы будете уверены, вы сможете передать это обратно в mysql
mysqldump -uUSERNAME -pPASSWORD--add-drop-table --no-data DATABASE| \
grep ^DROP | \
grep -v 'foo\|bar' | \
mysql -uUSERNAME -pPASSWORD DATABASE