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

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

Примечание: необходимо выполнить его в phpMyAdmin

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_%';

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


просто другое решение с использованием GROUP_CONCAT таким образом, он выполнит один запрос drop, как
падение таблицы "таблица1", "таблица2"..

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;