Есть ли команда MySQL для реализации чего-то вроде «удаления таблиц, кроме t1, b2»? - PullRequest
1 голос
/ 21 сентября 2009

Я хочу сохранить t1, t2 и отбросить все остальные таблицы.

Ответы [ 2 ]

7 голосов
/ 21 сентября 2009

Вы можете использовать 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 и более поздних версиях) написать хранимую процедуру для этого.

1 голос
/ 21 сентября 2009

Вы можете использовать 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
...