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

101

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

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

Дениз Зетеман
источник

Ответы:

178

Вы не можете сделать это с помощью только одной команды 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_%';
Андре Миллер
источник
У меня только одна база данных, поэтому вторая мне не понадобится.
Deniz Zoeteman
4
@ElijahLynn источник ограничения, вероятно, связан с максимальной длиной GROUP_CONCAT. вы можете увеличить его, см. например здесь
Асаф Давид
7
Примечание для себя. Увеличьте максимальное количество символов: SET SESSION group_concat_max_len = 999999999;
Мохаммед Джораид,
2
Обратите внимание, что в некоторых случаях необходимо избегать подчеркивания в именах префиксов таблиц[...] LIKE 'myprefix\_%';
Magictallguy
1
Это возвращает множество повторяющихся table_names. Ответ, который опубликовал Панкадж Хурана, работает лучше ИМХО.
Джереми
37

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

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

Брэдли Славик
источник
1
Это совершенно правильный ответ. Другие ответы используют несколько шагов или требуют, чтобы это выполнялось вручную. Не знаю, как этот ответ не набирает больше голосов через 4 года!
gbe
25
show tables like 'prefix_%';

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

вы получите что-то вроде этого:

drop table myprefix_1, myprefix_2, myprefix_3;
Даниэль
источник
1
у меня не было доступа к information_schema.tables на веб-хосте, который я использую, поэтому спасибо!
Флоран Рокес
10

@ 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 с небольшими изменениями.

Алексей Рашков
источник
ОШИБКА 1064 (42000): у вас есть ошибка в синтаксисе SQL; проверьте руководство, которое соответствует версии вашего сервера MySQL, чтобы найти правильный синтаксис для использования рядом с '@tbls' в строке 1 ОШИБКА 1243 (HY000): Неизвестный обработчик подготовленных операторов (stmt) передан EXECUTE ERROR 1243 (HY000): Неизвестный обработчик подготовленных операторов (stmt) отдано DEALLOCATE PREPARE
Рони Тови
Синтаксическая ошибка: PREPARE stmt FROM 'DROP TABLE @tbls';
ledawg
5
SELECT CONCAT("DROP TABLE ", table_name, ";") 
FROM information_schema.tables
WHERE table_schema = "DATABASE_NAME" 
AND table_name LIKE "PREFIX_TABLE_NAME%";
Панкадж Хурана
источник
3

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

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;
Дуонг Во
источник
Это был единственный, который я обнаружил, который выполнял всю операцию за один прием, устраняя ограничения внешнего ключа.
Эван Мэттсон
2

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

drop table myprefix_1, myprefix_2, myprefix_3;

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

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

Асаф
источник
2

Я просто хотел опубликовать точный 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;
Дэнни Беккет
источник
2

Просто еще одно решение с использованием 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;
Мохамад Хамудей
источник
1

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

Drchuck
источник
завершение запроса с помощью \Gвместо ;дает немного более чистый результат
Стюарт Кардалл