10 ответов:
вы не можете сделать это с помощью только одной команды 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: отказ от ответственности здесь-оператор, созданный выше, отбросит все таблицы во всех базах данных с этим префиксом. Если вы хотите ограничить его определенным база данных, измените запрос, чтобы выглядеть так и заменить database_name с вашим собственным database_name:
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с запятыми поставь;на конце и добавьте таблицу падения к фронту.вы получите что-то, что выглядит так:
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, который я использовал - это что-то вроде смеси лучших 3 ответов:
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;
Comments