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