Atualizei minha resposta para executar a remoção das tabelas sem usar um procedimento armazenado. De uma chance !!!
RolandoMySQLDBA
Respostas:
11
Aqui está um procedimento armazenado que aceita o banco de dados e a sequência de prefixos como parâmetros:
DELIMITER $$DROPPROCEDURE DropTablesWithPrefix $$CREATEPROCEDURE DropTablesWithPrefix(db VARCHAR(64),prfx VARCHAR(20))
StoredProcedure:BEGINDECLARE ndx,maxidx INT;DECLARE giventable,SQLSTMT VARCHAR(500);CREATETABLE TableZapList(
droptablesql VARCHAR(512),
idx INT NOTNULL AUTO_INCREMENT PRIMARYKEY) ENGINE=MyISAM;INSERTINTO TableZapList (droptablesql)SELECT CONCAT('DROP TABLE ',table_schema,'.',table_name)FROM information_schema.tablesWHERE table_schema = db AND SUBSTR(table_name,LENGTH(prfx))= prfx;SELECT COUNT(1)INTO maxid FROM TableZapList;IF maxid =0THEN
LEAVE StoredProcedure;ENDIF;<BR>SET ndx =0;WHILE ndx < maxid DOSET ndx = ndx +1;SELECT droptablesql INTO SQLSTMT FROM TableZapList WHERE idx = ndx;SET@sql = SQLSTMT;
PREPARE stmt FROM@sql;EXECUTE stmt;DEALLOCATE PREPARE stmt;ENDWHILE;<BR>SELECT droptablesql FROM TableZapList;DROPTABLE TableZapList;END;
DELIMITER ;
UPDATE 2011-07-12 14:55 EDT
Eu apenas pensei em uma maneira mais limpa e simplista. Em vez de usar um procedimento armazenado, basta usar a função GROUP_CONCAT para reunir todas as tabelas para zap. Em seguida, componha em uma única consulta:
Aqui está uma consulta para descartar todas as tabelas que começam com wp_pol no banco de dados atual:
O script Rolandos funciona, mas pode ser necessário aumentar o parâmetro group_concat_max_len se você tiver muitas tabelas ou nomes muito longos: SET SESSION group_concat_max_len = 1000000;
9269
Em vez de mudar concat_max_len grupo +, I utilizado um subconsulta com um limite, e as gotas realizada em etapas
pedromanoel
A SUBSTRcondição no INSERTdeve ser: SUBSTR(table_name, 1, LENGTH(prfx)) = prfxentão funciona bem.
laurent
8
Primeiramente, gere um script para fazer isso no prompt do Unix:
$ echo "select concat('drop table ', table_name, ';') from information_schema.tables where table_name like 'prefix_%';"|mysql --user=root --password=blah --batch >drop.sql
Substitua o prefixo pelo seu. A --batchopção suprime a formatação sofisticada que o MySQL faz por padrão, para que você possa produzir um script SQL executável.
Revise o script e, se estiver OK, execute drop.sqlo mysql>prompt.
Eu já fiz um script auxiliar php para fazer isso, no entanto, eu queria saber se isso pode ser feito usando uma única consulta.
poelinca 02/02
11
Resposta simples: Não. Resposta complexa: Sim, se você o envolver em um procedimento armazenado . Então você pode executá-lo em um comando, mas seria o mesmo que chamar um script.
Gaius
4
Você deve consultar essas tabelas do sistema e criar uma cadeia para executá-la dinamicamente. No SQL Server, eu faria algo como:
declare@x varchar(max),@enter char(2);select@x ='',@enter = char(13)+char(10);Select@x =@x +'drop table '+ table_name +';'+@enter
from information_schema.tables
where table_name like'%accounting%'print@x
execute(@x);
Agora você precisa encontrar a tabela de sistema correspondente no MySQL.
Eu li sua resposta com muito cuidado. Isso é sinônimo de minha resposta. Embora no dialeto do SQL Server, sua resposta seja, em princípio, a primeira resposta correta. +1 !!!
RolandoMySQLDBA 16/08
3
Para responder à sua pergunta, não. Não no MySQL usando um único comando / consulta. Você terá que encadear comandos.
No entanto, se você deseja atingir seu objetivo, eis uma maneira:
Em um script bash, algo como:
#/bin/bash
TABLES=`mysql -s -e "SELECT CONCAT(TABLE_SCHEMA,'.',TABLE_NAME) AS T FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'dp_%'"-u user-p`for i in$TABLES;
do
echo "DROP TABLE $i;">> drops.sql ;
done
cat drops.sql
Em seguida, revise o arquivo drops.sql. Se estiver tudo bem, faça um BACKUP , então ...
mysql -u username -p -v --show-warnings < drops.sql
Respostas:
Aqui está um procedimento armazenado que aceita o banco de dados e a sequência de prefixos como parâmetros:
UPDATE 2011-07-12 14:55 EDT
Eu apenas pensei em uma maneira mais limpa e simplista. Em vez de usar um procedimento armazenado, basta usar a função GROUP_CONCAT para reunir todas as tabelas para zap. Em seguida, componha em uma única consulta:
Aqui está uma consulta para descartar todas as tabelas que começam com wp_pol no banco de dados atual:
A próxima coisa a fazer é armazenar o resultado em
A última coisa é executar o SQL dinâmico usando estes três (3) comandos:
Aqui está uma demonstração usando o MySQL 5.5.12 no Windows que funciona:
De uma chance !!!
fonte
SUBSTR
condição noINSERT
deve ser:SUBSTR(table_name, 1, LENGTH(prfx)) = prfx
então funciona bem.Primeiramente, gere um script para fazer isso no prompt do Unix:
Substitua o prefixo pelo seu. A
--batch
opção suprime a formatação sofisticada que o MySQL faz por padrão, para que você possa produzir um script SQL executável.Revise o script e, se estiver OK, execute
drop.sql
omysql>
prompt.fonte
Você deve consultar essas tabelas do sistema e criar uma cadeia para executá-la dinamicamente. No SQL Server, eu faria algo como:
Agora você precisa encontrar a tabela de sistema correspondente no MySQL.
fonte
Para responder à sua pergunta, não. Não no MySQL usando um único comando / consulta. Você terá que encadear comandos.
No entanto, se você deseja atingir seu objetivo, eis uma maneira:
Em um script bash, algo como:
Em seguida, revise o arquivo drops.sql. Se estiver tudo bem, faça um BACKUP , então ...
fonte
Você sempre pode usar um DATABASE ADMINISTRATOR como o navicat e esse tipo de problema desaparecerá com uma simples seleção e exclusão.
fonte