Как удалить мои таблицы, у которых есть префикс myprefix_
?
Примечание: нужно выполнить его в phpMyAdmin
Как удалить мои таблицы, у которых есть префикс 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, который вы можете скопировать и выполнить, чтобы удалить таблицы.
РЕДАКТИРОВАТЬ: отказ от ответственности здесь - оператор, сгенерированный выше, удалит все таблицы во всех базах данных с этим префиксом. Если вы хотите ограничить его конкретной базой данных, измените запрос, чтобы он выглядел так, и замените имя_базы_база своим собственным именем_базы:
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
запятой
положите 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 с небольшими изменениями.
Вы можете сделать это в одной команде с MySQL:
drop table myprefix_1, myprefix_2, myprefix_3;
Вам, вероятно, придется динамически создавать список таблиц в коде.
Альтернативным подходом было бы использовать общедоступную обычную библиотеку для MySQL 5.
Я удаляю таблицу успешно с помощью запроса редактирования, чтобы это понравилось
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;
SELECT CONCAT("DROP TABLE ", table_name, ";")
FROM information_schema.tables
WHERE table_schema = "DATABASE_NAME"
AND table_name LIKE "PREFIX_TABLE_NAME%";
Я обнаружил, что подготовленные заявления были немного сложными, чтобы работать для меня, но установка 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.
Я просто хотел опубликовать точный 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, чтобы выполнить один запрос на удаление, например, ТАБЛИЦА DROP 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;