SQL: eliminazione di tabelle con prefisso


Risposte:


178

Non puoi farlo con un solo comando MySQL, tuttavia puoi usare MySQL per costruire l'istruzione per te:

Nella shell MySQL o tramite PHPMyAdmin, utilizzare la seguente query

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

Questo genererà un'istruzione DROP che puoi copiare ed eseguire per eliminare le tabelle.

EDIT: un disclaimer qui: la dichiarazione generata sopra lascerà cadere tutte le tabelle in tutti i database con quel prefisso. Se vuoi limitarlo a un database specifico, modifica la query in modo che assomigli a questo e sostituisci database_name con il tuo 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_%';

Ho solo un database quindi non avrò bisogno del secondo.
Deniz Zoeteman

4
@ElijahLynn l'origine del limite è probabilmente dovuta alla lunghezza massima di GROUP_CONCAT. puoi ingrandirlo, vedi ad esempio qui
Asaf David

7
Nota per se stessi. Aumenta il numero di caratteri max: SET SESSION group_concat_max_len = 999999999;
Mohammed Joraid

2
Si noti che, in alcuni casi, è necessario sfuggire ai caratteri di sottolineatura nei nomi dei prefissi delle tabelle[...] LIKE 'myprefix\_%';
Magictallguy

1
Ciò restituisce numerosi nomi di tabella duplicati. La risposta che Pankaj Khurana ha pubblicato funziona meglio IMHO.
Jeremy

37

Alcune delle risposte precedenti erano molto buone. Ho messo insieme le loro idee con alcune nozioni di altre risposte sul web.

Avevo bisogno di eliminare tutte le tabelle che iniziano con 'temp_' Dopo alcune iterazioni ho creato questo blocco di codice:

-- 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;

Spero che questo sia utile ad altri programmatori MySQL / PHP.


1
Questa è esattamente la risposta giusta. Altre risposte utilizzano più passaggi o richiedono che venga eseguita manualmente. Non so come questa risposta non abbia più voti dopo 4 anni!
gbe

25
show tables like 'prefix_%';

copia i risultati e incollali in un editor di testo o invia la query in un file, usa alcune ricerche e sostituzioni per rimuovere la formattazione indesiderata e sostituisci \ncon una virgola ;alla fine e aggiungi la tabella di rilascio in primo piano.

otterrai qualcosa che assomiglia a questo:

drop table myprefix_1, myprefix_2, myprefix_3;

1
non avevo accesso a information_schema.tables sul webhost che sto usando, quindi questa era la strada da percorrere, grazie!
Florent Roques dal

10

La soluzione @ andre-miller è buona, ma c'è anche una soluzione migliore e leggermente più professionale che ti aiuterà a eseguire tutto in una volta. Sarà comunque necessario più di un comando, ma questa soluzione ti consentirà di utilizzare l'SQL per build automatizzate.

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;

Nota: questo codice dipende dalla piattaforma, è per MySQL ma di sicuro potrebbe essere implementato per Postgre, Oracle e MS SQL con lievi modifiche.


ERRORE 1064 (42000): hai un errore nella sintassi SQL; controlla il manuale che corrisponde alla versione del tuo server MySQL per la sintassi corretta da usare vicino a '@tbls' alla riga 1 ERRORE 1243 (HY000): gestore di istruzioni preparato sconosciuto (stmt) fornito a EXECUTE ERROR 1243 (HY000): gestore di istruzioni preparato sconosciuto (stmt) dato a DEALLOCATE PREPARE
Roni Tovi

Errore di sintassi in: 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

Elimino correttamente la tabella modificando la query in questo modo

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;

Questo è stato l'unico che ho trovato che ha eseguito l'intera operazione in un solo passaggio, affrontando i vincoli delle chiavi esterne.
Evan Mattson

2

Puoi farlo con un comando con MySQL:

drop table myprefix_1, myprefix_2, myprefix_3;

Probabilmente dovrai creare l'elenco delle tabelle dinamicamente nel codice.

Un approccio alternativo potrebbe essere quello di utilizzare la libreria di routine per scopi generali per MySQL 5.


2

Volevo solo pubblicare l'SQL esatto che ho usato: è una sorta di miscela delle prime 3 risposte:

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

Solo un'altra soluzione che utilizza GROUP_CONCAT in modo che eseguirà una query di rilascio come
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

Ho scoperto che le dichiarazioni preparate erano un po 'complicate da far funzionare per me, ma l'impostazione GROUP_CONCAT_MAX_LENera essenziale quando si dispone di molte tabelle. Ciò ha portato a un semplice processo in tre passaggi con taglia e incolla dalla riga di comando di mysql che ha funzionato alla grande per me:

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

Quindi taglia e incolla con attenzione la lunga istruzione DROP risultante .


terminare la query con \Ginvece di ;dà un risultato un po 'più pulito
Stuart Cardall
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.