SQL: удаление таблиц с префиксом

Опубликовано: Комментариев: 0

Иногда нужно удалить все таблицы с префиксом wp_, или oc1_,  но к сожалению в MySQL нельзя выполнить команду вроде:

DROP TABLE oc1_*;
Таким образом, чтобы удалить все таблицы в MySQL с опеределённым префиксом, нам нужно сконструировать запрос, который сгенерирует DROP TABLE строку. А её уже потом выполнить в качестве запроса.Поскольку в MySQL существует ограничение на максимальную длину строки, создаваемой через GROUP_CONCAT, мы поднимем этот лимит.

Удалить все таблицы с префиксом oc1_ во всех БД

Где oc_1 - это префикс искомых таблиц:
SET SESSION group_concat_max_len = 99000000;
SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) 
    AS statement FROM information_schema.tables 
    WHERE table_name LIKE 'oc1_%';

Удалить таблицы с префиксом oc1_ в конкретной БД

Чтобы случайно не очистить другие таблицы, я бы советовал уточнить наш запрос названием таблицы в которой будет происходить удаление. Где oc_1 - это префикс искомых таблиц, а dev_table1 - имя БД, в которой я буду делать очистку:
SET SESSION group_concat_max_len = 99000000;
SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) 
    AS statement FROM information_schema.tables 
    WHERE table_schema = 'dev_table1' AND table_name LIKE 'oc1_%';
  и самый оптимальный для меня вариант, с сохранением результатов запроса в отдельный файл:
SET SESSION group_concat_max_len = 99000000;
SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) 
    AS statement FROM information_schema.tables 
    WHERE table_schema = 'dev_table1' AND table_name LIKE 'oc1_%'
INTO OUTFILE '/tmp/drop.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\\n';