Есть ли команда MySQL для реализации чего-то вроде отбрасываемых таблиц, кроме t1, b2?

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


person omg    schedule 21.09.2009    source источник
comment
Если бы вы хотели удалить все таблицы, но не саму базу данных, что бы вы использовали для этого? Используйте тот же трюк, но исключите эти...   -  person Wim ten Brink    schedule 21.09.2009
comment
@Мастерская Алекс, извини, не застала тебя.   -  person omg    schedule 21.09.2009
comment
Обычно, когда вы хотите удалить все таблицы, вы просто удаляете базу данных. (Это также приведет к удалению хранимых процедур и представлений, которые таким образом могут стать недействительными.) Если вы хотите удалить только таблицы, вам придется удалять их одну за другой. Если вы хотите удалить все, кроме этих двух, вам все равно придется удалять их по одному, но пропустить удаление тех, которые должны остаться.   -  person Wim ten Brink    schedule 21.09.2009


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

person derobert    schedule 21.09.2009
comment
Вот что я имел в виду. :-) Или что-то вроде этого. - person Wim ten Brink; 21.09.2009
comment
невероятно, это удалило information_schema, а не таблицы, которые я хотел, по сути, нарушив всю мою базу данных. - person john ktejik; 29.04.2020
comment
@johnktejik должен вывести список операторов SQL, которые не должны включать таблицы в information_schema (если только это не ваша текущая база данных) ... И, конечно же, посмотрите на вывод перед его запуском - person derobert; 29.04.2020

Вы можете использовать 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
person Paul Dixon    schedule 21.09.2009