SQL: удаление таблиц с префиксом

Как удалить мои таблицы, у которых есть префикс myprefix_ ?

Примечание: нужно выполнить его в phpMyAdmin

    Вы не можете сделать это с помощью только одной команды MySQL, однако вы можете использовать MySQL для создания инструкции для вас:

    В оболочке MySQL или через PHPMyAdmin используйте следующий запрос

     SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) AS statement FROM information_schema.tables WHERE table_name LIKE 'myprefix_%'; 

    Это приведет к созданию оператора DROP, который вы можете скопировать и выполнить, чтобы удалить таблицы.

    EDIT: отказ от ответственности здесь – оператор, сгенерированный выше, отбросит все таблицы во всех базах данных с этим префиксом. Если вы хотите ограничить его конкретной базой данных, измените запрос так, чтобы он выглядел так, и замените имя_базы_база своим собственным именем_базы:

     SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) AS statement FROM information_schema.tables WHERE table_schema = 'database_name' AND table_name LIKE 'myprefix_%'; 

    Некоторые из ранних ответов были очень хорошими. Я объединил свои идеи с некоторыми понятиями из других ответов в Интернете.

    Мне нужно было удалить все таблицы, начиная с «temp_». После нескольких итераций я придумал этот блок кода:

     -- Set up variable to delete ALL tables starting with 'temp_' SET GROUP_CONCAT_MAX_LEN=10000; SET @tbls = (SELECT GROUP_CONCAT(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'my_database' AND TABLE_NAME LIKE 'temp_%'); SET @delStmt = CONCAT('DROP TABLE ', @tbls); -- SELECT @delStmt; PREPARE stmt FROM @delStmt; EXECUTE stmt; DEALLOCATE PREPARE stmt; 

    Надеюсь, это полезно для других программистов MySQL / PHP.

     show tables like 'prefix_%'; 

    скопировать результаты и вставить их в текстовый редактор или вывести запрос в файл, использовать несколько поисков и заменять, чтобы удалить ненужное форматирование и заменить \n запятой put a ; на конце и добавить таблицу сбрасывания на передний план.

    вы получите то, что выглядит так:

     drop table myprefix_1, myprefix_2, myprefix_3; 

    Решение @ andre-miller хорошо, но есть еще лучше и немного более профессионально, что поможет вам выполнить все за один раз. Все равно потребуется больше одной команды, но это решение позволит вам использовать SQL для автоматизированных сборок.

     SET @tbls = (SELECT GROUP_CONCAT(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_NAME LIKE 'myprefix_%'); PREPARE stmt FROM 'DROP TABLE @tbls'; EXECUTE stmt USING @tbls; DEALLOCATE PREPARE stmt; 

    Примечание: этот код зависит от платформы, он для MySQL, но наверняка он может быть реализован для Postgre, Oracle и MS SQL с небольшими изменениями.

    Я удаляю таблицу успешно, чтобы изменить запрос.

     SET GROUP_CONCAT_MAX_LEN=10000; SET FOREIGN_KEY_CHECKS = 0; SET @tbls = (SELECT GROUP_CONCAT(CONCAT('`', TABLE_NAME, '`')) FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'pandora' AND TABLE_NAME LIKE 'temp_%'); SET @delStmt = CONCAT('DROP TABLE ', @tbls); -- SELECT @delStmt; PREPARE stmt FROM @delStmt; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET FOREIGN_KEY_CHECKS = 1; 

    Вы можете сделать это в одной команде с MySQL:

     drop table myprefix_1, myprefix_2, myprefix_3; 

    Вам, вероятно, придется строить таблицу таблицу динамически в коде, хотя.

    Альтернативным подходом было бы использование стандартной библиотеки подпрограмм для MySQL 5.

     SELECT CONCAT("DROP TABLE ", table_name, ";") FROM information_schema.tables WHERE table_schema = "DATABASE_NAME" AND table_name LIKE "PREFIX_TABLE_NAME%"; 

    Я просто хотел опубликовать точный SQL, который я использовал – это что-то вроде трех лучших ответов:

     SET GROUP_CONCAT_MAX_LEN=10000; SET @del = ( SELECT CONCAT('DROP TABLE ', GROUP_CONCAT(TABLE_NAME), ';') FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'database_name' AND TABLE_NAME LIKE 'prefix_%' ); PREPARE stmt FROM @del; EXECUTE stmt; DEALLOCATE PREPARE stmt; 

    Я обнаружил, что подготовленные заявления были немного сложными, чтобы работать для меня, но установка GROUP_CONCAT_MAX_LEN была необходима, когда у вас много таблиц. Это привело к простому трехэтапному процессу с вырезанием и вставкой из командной строки mysql, которая отлично поработала для меня:

     SET GROUP_CONCAT_MAX_LEN=10000; SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) AS statement FROM information_schema.tables WHERE table_name LIKE 'myprefix_%'; 

    Затем тщательно вырежьте и вставьте полученный длинный оператор DROP .

    Еще одно решение, использующее GROUP_CONCAT, так что он выполнит один запрос на падение, например
    DROP TABLE table1, table2, ..

     SET @Drop_Stm = CONCAT('DROP TABLE ', ( SELECT GROUP_CONCAT(TABLE_NAME) AS All_Tables FROM information_schema.tables WHERE TABLE_NAME LIKE 'prefix_%' AND TABLE_SCHEMA = 'database_name' )); PREPARE Stm FROM @Drop_Stm; EXECUTE Stm; DEALLOCATE PREPARE Stm; 
    Давайте будем гением компьютера.