SQL: видалення таблиць з префіксом


Відповіді:


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, який ви можете скопіювати та виконати, щоб скинути таблиці.

EDIT: Тут відмова від відповідальності - згенерований вище заява знищить усі таблиці у всіх базах даних із цим префіксом. Якщо ви хочете обмежити його певною базою даних, змініть запит, щоб він виглядав так, і замініть ім'я бази даних на своє власне ім'я бази даних:

SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) 
    AS statement FROM information_schema.tables 
    WHERE table_schema = 'database_name' AND table_name LIKE 'myprefix_%';

У мене є тільки одна база даних, тому мені не потрібно 2-ї.
Деніз Зоетеман

4
@ElijahLynn граничне джерело, ймовірно, обумовлено максимальною довжиною GROUP_CONCAT. Ви можете збільшити його, дивіться, наприклад, тут
Asaf David

7
Примітка до самостійного. Збільшення кількості макс. Знаків
Мохаммед Джораїд

2
Зауважте, що в деяких випадках потрібно уникати підкреслень у назвах префіксів таблиці[...] LIKE 'myprefix\_%';
Magictallguy

1
Це повертає численні повторювані імена таблиць. Відповідь, яку розмістив Панкай Хурана, працює краще ІМХО.
Джеремі

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-mill рішення добре, але є ще кращі та трохи більш професійні, які допоможуть вам виконати все за один раз. Все одно знадобиться більше однієї команди, але це рішення дозволить використовувати 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) віддається ДЕОЛОКАЦІЙНОЇ ПІДГОТОВКИ
Roni Tovi

Помилка синтаксису за адресою: ПІДГОТОВКА stmt З 'DROP TABLE @tbls';
ledawg


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 - це щось із суміші найкращих 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;

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 .


закінчення запиту \Gзамість того, щоб ;дати трохи чистіший результат
Stuart Cardall
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.