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


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

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

Author: Brian Tompsett - 汤莱恩, 2009-10-19

10 answers

Вы не можете сделать это с помощью одной команды 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_%';
 149
Author: Andre Miller, 2009-10-19 15:35:33

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

Мне нужно было удалить все таблицы, начинающиеся с '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.

 26
Author: Bradley Slavik, 2014-07-14 08:26:57
show tables like 'prefix_%';

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

Вы получите что-то похожее на это:

drop table myprefix_1, myprefix_2, myprefix_3;
 19
Author: Daniel, 2012-11-06 20:33:21

@ решение андре-Миллера хорошее, но есть еще лучшее и немного более профессиональное, которое поможет вам выполнить все за один раз. По-прежнему потребуется несколько команд, но это решение позволит вам использовать 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 с небольшими изменениями.

 10
Author: infinity, 2017-05-23 12:26:33

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

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;
 3
Author: Duong Vo, 2014-07-10 05:05:41

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

drop table myprefix_1, myprefix_2, myprefix_3;

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

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

 2
Author: Asaph, 2009-10-19 15:22:50
SELECT CONCAT("DROP TABLE ", table_name, ";") 
FROM information_schema.tables
WHERE table_schema = "DATABASE_NAME" 
AND table_name LIKE "PREFIX_TABLE_NAME%";
 2
Author: Pankaj Khurana, 2017-10-05 12:48:16

Я просто хотел опубликовать точный 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;
 1
Author: Danny Beckett, 2013-11-28 03:57:11

Я обнаружил, что подготовленные инструкции было немного сложно заставить работать на меня, но установка 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.

 1
Author: drchuck, 2013-12-02 04:45:27

Просто другое решение с использованием GROUP_CONCAT, поэтому он выполнит один запрос на удаление, например
ВЫПАДАЮЩИЙ СТОЛ таблица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;
 0
Author: Mohamad Hamouday, 2017-11-09 07:29:45