MySQL массового удаления таблицы, где таблица, как?

DROP TABLE (
SELECT table_name
FROM information_schema.`TABLES`
WHERE table_schema = 'myDatabase' AND table_name LIKE BINARY 'del%');

Я знаю, что это не работает! Что эквивалентно чему-то подобному в SQL? Я могу сделать простой скрипт на Python для этого, но мне было просто интересно, можем ли мы что-нибудь сделать с SQL напрямую. Я использую MySQL. Спасибо!

Ответы на вопрос(4)

Если вам просто нужно быстро отбросить кучу таблиц (не в чистом SQL, поэтому не отвечая непосредственно на этот вопрос), это может сделать команда из одной строки:

echo "show tables like 'fsm%'" | mysql | tail +2 | while read t; do echo "drop table \`$t\`;"; done | mysql
 13 нояб. 2015 г., 11:26
Пожалуйста, прекратите использованиеtailиспользоватьmysql -N вместо.
 14 авг. 2014 г., 22:22
tail +2 я не работал на Ubuntu, это нужно былоtail -n +2
Решение Вопроса

готовые заявления -

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;
 17 авг. 2015 г., 12:08
Конечно это ограничено, 1024 по умолчанию. Значение group_concat_max_len должно быть увеличено.
 15 июн. 2012 г., 17:07
Я ответил аналогичным образом в DBA StackExchangedba.stackexchange.com/a/1369/877 , +1 за использование подготовленной выписки !!!
 07 сент. 2012 г., 22:54
Я изо всех сил пытался получить команды DROP TABLE в формате, который MySQL мог бы фактически выполнить с помощью PREPARE. Это помогло прояснить путаницу и творило чудеса :)
 18 авг. 2013 г., 15:53
отличный ответ! Стоит отметить, чтоGROUP_CONCAT будет обрезать свой вывод, если он превышает значение по умолчанию (1024, в текущей версии), следовательно, могут быть ошибки во время выполнения этого сценария. Смотрите ссылку здесь:dev.mysql.com/doc/refman/5.0/en/…
 ThinkCode15 июн. 2012 г., 17:10
Я до сих пор не использовал подготовленные заявления. Спасибо за то, что научили меня новому способу сделать это!

Незначительное улучшение@ Devart's 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;

Этот сценарий должен выполняться повторно до тех пор, пока вывод консоли не будетNULL

Изменения:

backtick (`) wrapping the table name (if it contains non standard characters) added a LIMIT to avoid the truncation issue I commented about added a "print" (select @tables;) to have some kind of control when to stop executing the script
 21 февр. 2018 г., 15:59
Я получаю ошибку. ОШИБКА 1064 (42000): у вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с 'NULL'; в строке 1
 06 июл. 2014 г., 03:20
+1 к улучшению по сравнению с оригинальным ответом. Но с лимитом 10 означает, что одновременно обрабатываются только 10 таблиц?
 06 июл. 2014 г., 09:18
@Joraid, это правильно. Обратите внимание на комментарий использования сценария: "Этот сценарий должен выполняться повторно до тех пор, пока вывод консоли не будетNULL& Quot ;. То есть нужно повторять это снова и снова из-заLIMIT добавил к этому.

Я нашел полезным добавить IFNULL в решения Devart, чтобы избежать генерации ошибки, если нет таблиц, соответствующих запросу.

SET @tables = IFNULL(CONCAT('DROP TABLE ', @tables),'SELECT NULL;');

Ваш ответ на вопрос