Я хочу сохранить t1, t2 и удалить все остальные таблицы.
Есть ли команда MySQL для реализации чего-то вроде отбрасываемых таблиц, кроме t1, b2?
Ответы (2)
Вы можете использовать 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
.)
Используя 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, чтобы инвертировать совпадение - нам нужны операторы, которые не упоминают таблицы, которые мы сохраняем (другой способ сделать это - опции --ignore-table для 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