2012-10-28 15 views
5

Ho un mucchio di tabelle in un database MySQL, alcuni di loro iniziano con phpbb_ * che volevo eliminare tutti loro. Qualcuno conosce un modo per farlo invece di faredrop tables using regex - MySQL

drop table <tablename>; 

ogni singola volta? Come una regex?

drop table phpbb* 

o qualcosa del genere?

+1

Forse controllare questo post: http://stackoverflow.com/questions/1589278/sql-deleting-tables-with-prefix –

risposta

7

È possibile utilizzare questa procedura MySQL:

DELIMITER $$ 
CREATE PROCEDURE drop_tables_like(pattern VARCHAR(255), db VARCHAR(255)) 
BEGIN 
    SELECT @str_sql:=CONCAT('drop table ', GROUP_CONCAT(table_name)) 
    FROM information_schema.tables 
    WHERE table_schema=db AND table_name LIKE pattern; 

    PREPARE stmt from @str_sql; 
    EXECUTE stmt; 
    DROP prepare stmt; 
END$$ 

DELIMITER ; 

per far cadere tutte le tabelle che iniziano con 'a' nel database 'test1' è possibile eseguire:

CALL drop_tables_like('a%', 'test1'); 

Riferimento: http://dev.mysql.com/doc/refman/5.5/en/drop-table.html

0

Solo per aggiungere alla risposta di cui sopra, MySQL restituisce un errore ERROR 1046 (3D000): No database selected se nessun database è selezionato prima di iniziare la procedura. Quindi anteponi questa affermazione use <<db_name>>; alla risposta di cui sopra. La soluzione potrebbe essere rivisto:

use <<db_name>>;  
DELIMITER $$ 
CREATE PROCEDURE drop_tables_like(pattern VARCHAR(255), db VARCHAR(255)) 
BEGIN 
    SELECT @str_sql:=CONCAT('drop table ', GROUP_CONCAT(table_name)) 
    FROM information_schema.tables 
    WHERE table_schema=db AND table_name LIKE pattern; 

    PREPARE stmt from @str_sql; 
    EXECUTE stmt; 
    DROP prepare stmt; 
END$$  
DELIMITER ; 
CALL drop_tables_like('a%', '<<db_name>>'); 

Assicurarsi di sostituire <> con il nome effettivo del database. Saluti!