MySQL массив отбрасывать таблицу, где таблица нравится?
DROP TABLE (
SELECT table_name
FROM information_schema.`TABLES`
WHERE table_schema = 'myDatabase' AND table_name LIKE BINARY 'del%');
Я знаю, что это не работает! Что эквивалентно для чего-то подобного в SQL? Я могу вытащить простой Python script, чтобы сделать это, но просто интересно, можем ли мы что-то сделать с SQL напрямую. Я использую MySQL. Спасибо!
Ответы
Ответ 1
Вы можете использовать подготовленные заявления -
SET @tables = NULL;
SELECT GROUP_CONCAT('`', table_schema, '`.`', table_name,'`') INTO @tables FROM information_schema.tables
WHERE table_schema = 'myDatabase' AND table_name LIKE BINARY 'del%';
SET @tables = CONCAT('DROP TABLE ', @tables);
PREPARE stmt1 FROM @tables;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
Он будет генерировать и выполнять оператор вроде этого -
DROP TABLE myDatabase.del1, myDatabase.del2, myDatabase.del3;
Ответ 2
Небольшое улучшение @Devart answer:
SET @tables = NULL;
SELECT GROUP_CONCAT(table_schema, '.`', table_name, '`') INTO @tables FROM
(select * from
information_schema.tables
WHERE table_schema = 'myDatabase' AND table_name LIKE 'del%'
LIMIT 10) TT;
SET @tables = CONCAT('DROP TABLE ', @tables);
select @tables;
PREPARE stmt1 FROM @tables;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
Этот script должен выполняться несколько раз, пока вывод консоли не будет NULL
Изменения:
- backtick (`) обертывание имени таблицы (если оно содержит нестандартные символы)
- добавил
LIMIT
, чтобы избежать проблемы усечения, о которой я прокомментировал
- добавил "print" (
select @tables;
), чтобы иметь какой-то контроль, когда прекратить выполнение script
Ответ 3
Если вам просто нужно быстро отбросить кучу таблиц (не в чистом SQL, так что напрямую не отвечая на этот вопрос), команда one line shell может сделать это:
echo "show tables like 'fsm%'" | mysql | tail +2 | while read t; do echo "drop table \`$t\`;"; done | mysql
Ответ 4
Мне было полезно добавить решения IFNULL в Devart, чтобы избежать генерации ошибки, если нет таблиц, соответствующих запросу.
SET @tables = IFNULL(CONCAT('DROP TABLE ', @tables),'SELECT NULL;');