Come eliminare le mie tabelle che hanno tutte il prefisso myprefix_
?
Nota: è necessario eseguirlo in phpMyAdmin
Come eliminare le mie tabelle che hanno tutte il prefisso myprefix_
?
Nota: è necessario eseguirlo in phpMyAdmin
Risposte:
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_%';
[...] LIKE 'myprefix\_%';
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.
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 \n
con 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;
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.
SELECT CONCAT("DROP TABLE ", table_name, ";")
FROM information_schema.tables
WHERE table_schema = "DATABASE_NAME"
AND table_name LIKE "PREFIX_TABLE_NAME%";
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;
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.
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;
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;
Ho scoperto che le dichiarazioni preparate erano un po 'complicate da far funzionare per me, ma l'impostazione GROUP_CONCAT_MAX_LEN
era 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 .
\G
invece di ;
dà un risultato un po 'più pulito