SQL: удаление таблиц с префиксом
Иногда нужно удалить все таблицы с префиксом 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';