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';