Truncar todas as tabelas em um banco de dados MySQL em um comando?
346
Existe uma consulta (comando) para truncar todas as tabelas em um banco de dados em uma operação? Quero saber se posso fazer isso com uma única consulta.
Truncar todas as tabelas? você quis dizer truncar todas as colunas de todas as tabelas em um banco de dados? Em que linguagem de consulta está? (por exemplo, SQL, MySQL, Oracle, Postgres, etc)
Jay
Não tenho certeza se eu recomendaria fazer isso, pois você poderia facilmente se meter em problemas. Existe uma razão pela qual você não pode apenas fazer o script dos truncados e executar o script?
GrayWizardx
thanks 4 a responder, mas única razão pela qual não scripting que está com falta de tempo, de modo pensado runnind uma consulta no mysql
Devang
ya sua no meio de consulta mysql..and algo semelhante a tabela truncada table_name..here eu quero truncar todas as linhas de todas as tabelas no meu db em uma consulta
Devang
Você pode usar o Information_Schema com um cursor. Não tenho certeza sobre o MySQL, mas deve apoiar information_schema.tables
GrayWizardx
Respostas:
340
Drop (remover tabelas)
mysql -Nse 'show tables' DATABASE_NAME |whilereadtable; do mysql -e "drop table $table" DATABASE_NAME; done
Truncar (ou seja, tabelas vazias)
mysql -Nse 'show tables' DATABASE_NAME |whilereadtable; do mysql -e "truncate table $table" DATABASE_NAME; done
Sim, limpo, ty. Mas pode ser necessário executar isso com -uUSER -pPASSWORD. Também pode ser necessário executá-lo várias vezes se você tiver o FK sem excluir em cascata.
mihaicc
47
Se você tiver problemas com o FK, como " Não é possível excluir ou atualizar uma linha pai: uma restrição de chave estrangeira falha ", desabilite as verificações de chave estrangeira modificando o comando da seguinte maneira:mysql -e "SET FOREIGN_KEY_CHECKS = 0; drop table $table" DATABASE_NAME
Ethan P.
24
Não há necessidade de repetir o cliente mysql. Tire-o do circuito assim:mysql -Nse 'show tables' DATABASE_NAME | while read table; do echo "drop table $table;"; done | mysql DATABASE_NAME
Com base na resposta e nos comentários acima, e como eles não funcionaram conforme o esperado, criei um script bash simples que você pode usar para isso. Você pode encontrá-lo em: gist.github.com/mocanuga/eff26a3dcc40ef657a1c812f68511f6d
mocanuga
145
truncar várias tabelas de banco de dados na instância Mysql
SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME,';')FROM INFORMATION_SCHEMA.TABLES where table_schema in('db1_name','db2_name');
Use o resultado da consulta para truncar tabelas
Nota: pode ser que você receba este erro:
ERROR 1217(23000): Cannot deleteorupdate a parent row: a foreignkeyconstraint fails
Isso acontece se houver tabelas com referências de chaves estrangeiras à tabela que você está tentando eliminar / truncar.
Antes de truncar tabelas Tudo que você precisa fazer é:
Essa é provavelmente a melhor solução se você tiver um usuário e uma senha para o seu banco de dados e não quiser digitá-los visivelmente no seu shell.
Bach
5
Promovido porque esta solução requer apenas acesso ao banco de dados e não SSH. Além disso, é independente do sistema operacional.
mastazi
@mastazi eu tenho algumas perguntas: 1. o que significa "table_schema"? está do nome do esquema? 2.o que TABLE_NAME representa? está de pé para as tabelas que devem ser excluídas? 3. devo escrever alto as tabelas que devem ser excluídas usando o comando como "('db1_name', 'db2_name')"?
AAEM 17/08/19
@Ahmed, as únicas substituições necessárias são que você deve substituir db1_name e db2_name pelos nomes dos seus bancos de dados. Então você deve copiar os resultados desta consulta e colá-los como uma nova consulta mysql e executá-los. O INFORMATION_SCHEMA é um esquema interno que vem pré-instalado em todas as instalações do MySQL e contém informações sobre seus bancos de dados, não toque nele ou o MySQL começará a se comportar mal :-) table_schema e table_name são colunas da tabela chamada "TABLES" information_schema
mastazi
com "db_name", você quer dizer o nome do esquema? eu só tenho 1 esquema que eu quero apagar seus dados tabelas
AAEM
67
Use o phpMyAdmin desta maneira:
Visualização do banco de dados => Verificar tudo (tabelas) => Vazio
Se você deseja ignorar as verificações de chave estrangeira, desmarque a caixa que diz:
[] Ativar verificações de chave estrangeira
Você precisará estar executando a versão 4.5.0 ou superior para obter essa caixa de seleção.
hi..thanks para d responder eu tentei esta consulta, mas não parece work..is der algo como truncar a tabela table_name que eu posso usar para todas as tabelas no meu db ..
Devang
Esqueci que o MySQL não suporta diretamente o operador "+". Supondo que esse seja o erro, adicionei o exemplo CONCAT () acima. Se você ainda estiver recebendo uma mensagem de erro, compartilhe a mensagem de erro real.
praia
esta consulta funciona, mas e se eu tiver um nome diff db, por exemplo, devang ... é meu nome db, portanto, se eu o usar de acordo com a consulta acima, gera o erro foll. A tabela 'devang.TABLES' não existe
devang
3
Ahh INFORMATION_SCHEMA é uma exibição que existe no banco de dados ativo. Se você alterar seu banco de dados, a exibição será executada nesse banco de dados. Não há necessidade de modificar a consulta ao alterar os bancos de dados. Basta seguir estas etapas: 1) alterar o banco de dados ativo. 2) execute o script. 3) copie os resultados 4) cole os resultados novamente no editor 5) execute os resultados. Todas as tabelas no banco de dados ativo agora estão truncadas.
Praia
11
Cuidado! Isso seleciona todas as tabelas em todos os bancos de dados (mesmo os que NÃO estão no banco de dados atual. O exemplo do MySQL não funciona, mas no meu caso, ele retornou 293 linhas (tabelas) em vez de 66. Imagine a perda de dados ...
f4der 28/11
19
Eu encontrei isso para soltar todas as tabelas em um banco de dados:
Se você quiser trabalhar com banco de dados atual (e, assim, tornar este código portátil), mudança de última condição SELECTpara isso:AND table_schema = DATABASE();
alx
Não é truncado para mim. MySQL 5.7.25
Lucas Bustamante
14
Achei mais simples fazer algo como o código abaixo, basta substituir os nomes das tabelas pelos seus. importante verifique se a última linha é sempre SET FOREIGN_KEY_CHECKS = 1;
SET FOREIGN_KEY_CHECKS=0;TRUNCATE`table1`;TRUNCATE`table2`;TRUNCATE`table3`;TRUNCATE`table4`;TRUNCATE`table5`;TRUNCATE`table6`;TRUNCATE`table7`;SET FOREIGN_KEY_CHECKS=1;
Para truncar uma tabela, é necessário eliminar as restrições de chave estrangeira mapeadas para as colunas nesta tabela de outras tabelas (na verdade, em todas as tabelas no DB / Schema específico).
Portanto, todas as restrições de chave estrangeira devem ser eliminadas inicialmente, seguidas pelo truncamento da tabela.
Opcionalmente, use a tabela de otimização (no mysql, innodb engine esp) para recuperar o tamanho / espaço de dados usado no SO após o truncamento de dados.
Depois que o truncamento de dados for realizado, crie as mesmas restrições de chave estrangeira novamente na mesma tabela. Veja abaixo um script que geraria o script para executar as operações acima.
se estiver usando o sql server 2005, existe um procedimento armazenado oculto que permite executar um comando ou um conjunto de comandos em todas as tabelas dentro de um banco de dados. Aqui está como você chamaria TRUNCATE TABLEcom este procedimento armazenado:
Para o MySql, no entanto, você pode usar o mysqldump e especificar as opções --add-drop-tablese --no-datapara eliminar e criar todas as tabelas que ignoram os dados. como isso:
Não. Não existe um único comando para truncar todas as tabelas mysql de uma só vez. Você precisará criar um pequeno script para truncar as tabelas uma a uma.
Aqui está minha variante para ter 'uma declaração para truncar todos eles'.
Primeiro, estou usando um banco de dados separado chamado 'util' para meus procedimentos armazenados auxiliares. O código do meu procedimento armazenado para truncar todas as tabelas é:
SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME,';')FROM INFORMATION_SCHEMA.TABLES where table_schema in('databasename1','databasename2');
Se não for possível excluir ou atualizar uma linha pai: uma restrição de chave estrangeira falha
Isso acontece se houver tabelas com referências de chaves estrangeiras à tabela que você está tentando eliminar / truncar.
Antes de truncar tabelas Tudo que você precisa fazer é:
SET FOREIGN_KEY_CHECKS=0;
Trunque suas tabelas e altere-o novamente para
SET FOREIGN_KEY_CHECKS=1;
usuário este código php
$truncate= mysql_query("SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') as tables_query FROM INFORMATION_SCHEMA.TABLES where table_schema in ('databasename')");while($truncateRow=mysql_fetch_assoc($truncate)){
mysql_query($truncateRow['tables_query']);}?>
Aqui está um procedimento que deve truncar todas as tabelas no banco de dados local.
Deixe-me saber se não funcionar e eu excluirei esta resposta.
Não testado
CREATEPROCEDURE truncate_all_tables()BEGIN-- Declare local variablesDECLARE done BOOLEAN DEFAULT0;DECLARE cmd VARCHAR(2000);-- Declare the cursorDECLARE cmds CURSORFORSELECT CONCAT('TRUNCATE TABLE ', TABLE_NAME)FROM INFORMATION_SCHEMA.TABLES;-- Declare continue handlerDECLARECONTINUE HANDLER FOR SQLSTATE '02000'SET done=1;-- Open the cursorOPEN cmds;-- Loop through all rows
REPEAT
-- Get order numberFETCH cmds INTO cmd;-- Execute the command
PREPARE stmt FROM cmd;EXECUTE stmt;DROP PREPARE stmt;-- End of loop
UNTIL done END REPEAT;-- Close the cursorCLOSE cmds;END;
Acho que TRUNCATE TABLE .. tem problemas com restrições de chave estrangeira, mesmo após um NOCHECK CONSTRAINT ALL, então, em vez disso, utilizo uma instrução DELETE FROM. Isso significa que as sementes de identidade não são redefinidas; você sempre pode adicionar um DBCC CHECKIDENT para conseguir isso.
Use o código abaixo para imprimir na janela da mensagem o sql para truncar todas as tabelas no banco de dados, antes de executá-lo. Apenas torna um pouco mais difícil cometer um erro.
Não tenho certeza, mas acho que existe um comando usando o qual você pode copiar o esquema do banco de dados em um novo banco de dados; depois de fazer isso, você pode excluir o banco de dados antigo e, depois disso, pode novamente copiar o esquema do banco de dados para o nome antigo.
mysqldump -uuser -ppassword --no-data salesLeadsBrittany> salesLeadsTemplate.sql Isso criará um arquivo sql apenas com o esquema (sem dados). Você pode excluir a base de dados após este comando e pode recriar o banco de dados importando o esquema.
GJ.
0
Sei que este não é exatamente um comando, mas o resultado desejado pode ser alcançado no phpMyAdmin seguindo estas etapas:
Selecionar (todas) as tabelas a serem removidas (marcar todas)
Selecione "Soltar" / "Truncar" na lista "Com selecionado:"
Na página de confirmação ("Deseja realmente:") copie a consulta (tudo com fundo vermelho)
Vá no topo, clique em SQL e escreva: "SET FOREIGN_KEY_CHECKS = 0;" depois cole a consulta copiada anteriormente
Clique em "Go"
A idéia é obter rapidamente todas as tabelas do banco de dados (o que você faz em 5 segundos e 2 cliques), mas desabilita as verificações de chave estrangeira primeiro. Sem CLI e sem descartar o banco de dados e adicioná-lo novamente.
TB=$( mysql -Bse "show tables from DATABASE");for i in${TB};
do echo "Truncating table ${i}";
mysql -e "set foreign_key_checks=0; set unique_checks=0;truncate table DATABASE.${i}; set foreign_key_checks=1; set unique_checks=1";
sleep 1;
done
-
David,
Obrigado por reservar um tempo para formatar o código, mas é assim que deve ser aplicado.
-Kurt
Em uma caixa UNIX ou Linux:
Verifique se você está em um shell bash. Esses comandos devem ser executados a partir da linha de comando da seguinte maneira.
Nota:
Eu armazeno minhas credenciais no meu arquivo ~ / .my.cnf, para não precisar fornecê-las na linha de comando.
Nota:
cpm é o nome do banco de dados
Estou apenas mostrando uma pequena amostra dos resultados, de cada comando.
Encontre suas restrições de chave estrangeira:
klarsen@Chaos:~$ mysql -Bse "select concat(table_name, ' depends on ', referenced_table_name)
from information_schema.referential_constraints
where constraint_schema = 'cpm'
order by referenced_table_name"
aprovaçã0_external depende do pedido de aprovação
endereço depende do cliente
customer_identification depende do cliente
external_id depende do cliente
credencial depende do cliente
email_address depende do cliente
request_request depende do cliente
customer_status depende do cliente
customer_image depende do cliente
Liste as tabelas e as contagens de linhas:
klarsen@Chaos:~$ mysql -Bse "SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'cpm'"| cat -n
1 address 2972 approval_external_system 03 approval_request 04 country 1895 credential 4686 customer 67767 customer_identification 56318 customer_image 29 customer_status 13639
Trunque suas tabelas:
klarsen@Chaos:~$ TB=$( mysql -Bse "show tables from cpm");for i in${TB}; do echo "Truncating table ${i}"; mysql -e "set foreign_key_checks=0; set unique_checks=0;truncate table cpm.${i}; set foreign_key_checks=1; set unique_checks=1"; sleep 1; done
Truncando o endereço da tabela
Truncando tabela de aprovação_external_system
Truncando a aprovação da tabela
Truncando o país da tabela
Credencial de tabela truncada
Truncando o cliente da tabela
Tabela de truncagem customer_identification
Truncando tabela customer_image
Truncando tabela customer_status
Verifique se funcionou:
klarsen@Chaos:~$ mysql -Bse "SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'cpm'"| cat -n
1 address 02 approval_external_system 03 approval_request 04 country 05 credential 06 customer 07 customer_identification 08 customer_image 09 customer_status 010 email_address 0
Em uma caixa do Windows:
NOTA:
cpm é o nome do banco de dados
C:\>for/F "tokens=*"%a IN('mysql -Bse "show tables" cpm') do mysql -e "set foreign_key_checks=0; set unique_checks=0; truncate table %a; foreign_key_checks=1; set unique_checks=1" cpm
Ei James, acho que o OP está procurando primeiro um liner .... e segundo um comando para obter todas as tabelas uma vez desativadas e excluí-las. isso requer algum tipo de intervenção do usuário. obrigado pelo post embora
Respostas:
Drop (remover tabelas)
Truncar (ou seja, tabelas vazias)
fonte
mysql -e "SET FOREIGN_KEY_CHECKS = 0; drop table $table" DATABASE_NAME
mysql -Nse 'show tables' DATABASE_NAME | while read table; do echo "drop table $table;"; done | mysql DATABASE_NAME
truncar várias tabelas de banco de dados na instância Mysql
Use o resultado da consulta para truncar tabelas
Nota: pode ser que você receba este erro:
Isso acontece se houver tabelas com referências de chaves estrangeiras à tabela que você está tentando eliminar / truncar.
Antes de truncar tabelas Tudo que você precisa fazer é:
Trunque suas tabelas e altere-o novamente para
fonte
Use o phpMyAdmin desta maneira:
Se você deseja ignorar as verificações de chave estrangeira, desmarque a caixa que diz:
Você precisará estar executando a versão 4.5.0 ou superior para obter essa caixa de seleção.
Não é MySQL CLI-fu, mas ei, funciona!
fonte
MS SQL Server 2005+ (remover PRINT para execução real ...)
Se a sua plataforma de banco de dados suportar visualizações VIEW_SCHEMA, pegue os resultados da seguinte consulta e execute-os.
Tente isso no MySQL:
Adicionar um ponto-e-vírgula ao Concat facilita o uso, por exemplo, do ambiente de trabalho mysql.
fonte
Eu encontrei isso para soltar todas as tabelas em um banco de dados:
Útil se você está limitado pela solução de hospedagem (não é possível descartar um banco de dados inteiro).
Eu o modifiquei para truncar as tabelas. Não existe "--add-truncate-table" para o mysqldump, então eu fiz:
funciona para mim --edit, corrigindo um erro de digitação no último comando
fonte
fonte
SELECT
para isso:AND table_schema = DATABASE();
Achei mais simples fazer algo como o código abaixo, basta substituir os nomes das tabelas pelos seus. importante verifique se a última linha é sempre SET FOREIGN_KEY_CHECKS = 1;
fonte
Isso imprimirá o comando para truncar todas as tabelas:
fonte
Depois que o truncamento de dados for realizado, crie as mesmas restrições de chave estrangeira novamente na mesma tabela. Veja abaixo um script que geraria o script para executar as operações acima.
Agora, execute o script Db Truncate.sql gerado
Benefícios. 1) Recuperar espaço em disco 2) Não é necessário descartar e recriar o banco de dados / esquema com a mesma estrutura
Desvantagens. 1) Restrições FK devem ser nomes na tabela com o nome que contém 'FK' no nome da restrição.
fonte
se estiver usando o sql server 2005, existe um procedimento armazenado oculto que permite executar um comando ou um conjunto de comandos em todas as tabelas dentro de um banco de dados. Aqui está como você chamaria
TRUNCATE TABLE
com este procedimento armazenado:Aqui está um bom artigo que detalha mais.
Para o MySql, no entanto, você pode usar o mysqldump e especificar as opções
--add-drop-tables
e--no-data
para eliminar e criar todas as tabelas que ignoram os dados. como isso:guia de uso do mysqldump no dev.mysql
fonte
Use isso e forme a consulta
Agora use isso para usar esta consulta
se você receber um erro como este
a maneira mais fácil de passar é no topo do seu arquivo, adicione esta linha
que diz que não queremos verificar as restrições de chave estrangeira enquanto examinamos esse arquivo.
Ele truncará todas as tabelas nos bancos de dados db1 e bd2.
fonte
Não. Não existe um único comando para truncar todas as tabelas mysql de uma só vez. Você precisará criar um pequeno script para truncar as tabelas uma a uma.
ref: http://dev.mysql.com/doc/refman/5.0/en/truncate-table.html
fonte
Aqui está minha variante para ter 'uma declaração para truncar todos eles'.
Primeiro, estou usando um banco de dados separado chamado 'util' para meus procedimentos armazenados auxiliares. O código do meu procedimento armazenado para truncar todas as tabelas é:
Depois de ter esse procedimento armazenado no banco de dados util, você pode chamá-lo como
que agora é exatamente uma afirmação :-)
fonte
aqui porque eu sei aqui
Se não for possível excluir ou atualizar uma linha pai: uma restrição de chave estrangeira falha
Isso acontece se houver tabelas com referências de chaves estrangeiras à tabela que você está tentando eliminar / truncar.
Antes de truncar tabelas Tudo que você precisa fazer é:
Trunque suas tabelas e altere-o novamente para
usuário este código php
confira detalhes aqui link
fonte
Aqui está um procedimento que deve truncar todas as tabelas no banco de dados local.
Deixe-me saber se não funcionar e eu excluirei esta resposta.
Não testado
fonte
Acho que TRUNCATE TABLE .. tem problemas com restrições de chave estrangeira, mesmo após um NOCHECK CONSTRAINT ALL, então, em vez disso, utilizo uma instrução DELETE FROM. Isso significa que as sementes de identidade não são redefinidas; você sempre pode adicionar um DBCC CHECKIDENT para conseguir isso.
Use o código abaixo para imprimir na janela da mensagem o sql para truncar todas as tabelas no banco de dados, antes de executá-lo. Apenas torna um pouco mais difícil cometer um erro.
fonte
Não tenho certeza, mas acho que existe um comando usando o qual você pode copiar o esquema do banco de dados em um novo banco de dados; depois de fazer isso, você pode excluir o banco de dados antigo e, depois disso, pode novamente copiar o esquema do banco de dados para o nome antigo.
fonte
Sei que este não é exatamente um comando, mas o resultado desejado pode ser alcançado no phpMyAdmin seguindo estas etapas:
A idéia é obter rapidamente todas as tabelas do banco de dados (o que você faz em 5 segundos e 2 cliques), mas desabilita as verificações de chave estrangeira primeiro. Sem CLI e sem descartar o banco de dados e adicioná-lo novamente.
fonte
-
David,
Obrigado por reservar um tempo para formatar o código, mas é assim que deve ser aplicado.
-Kurt
Em uma caixa UNIX ou Linux:
Verifique se você está em um shell bash. Esses comandos devem ser executados a partir da linha de comando da seguinte maneira.
Nota:
Eu armazeno minhas credenciais no meu arquivo ~ / .my.cnf, para não precisar fornecê-las na linha de comando.
Nota:
cpm é o nome do banco de dados
Estou apenas mostrando uma pequena amostra dos resultados, de cada comando.
Encontre suas restrições de chave estrangeira:
Liste as tabelas e as contagens de linhas:
Trunque suas tabelas:
Verifique se funcionou:
Em uma caixa do Windows:
NOTA:
cpm é o nome do banco de dados
fonte
A consulta MySQL a seguir produzirá uma consulta única que truncará todas as tabelas em um determinado banco de dados. Ignora as teclas ESTRANGEIRAS:
fonte
fonte
Soln 1)
Soln 2)
- editar ----
fonte
Isso funcionou para mim. Alterar banco de dados, nome de usuário e senha de acordo.
mysql -Nse 'show tables' -D DATABASE -uUSER -pPWD | while read table; do echo "SET FOREIGN_KEY_CHECKS = 0;drop table \`$table\`;SET FOREIGN_KEY_CHECKS = 1;"; done | mysql DATABASE -uUSER -pPWD
fonte
Uma idéia poderia ser simplesmente soltar e recriar as tabelas?
EDITAR:
@Jonathan Leffler: True
Outra sugestão (ou caso você não precise truncar TODAS as tabelas):
Por que não criar apenas um procedimento armazenado básico para truncar tabelas específicas
fonte
Aqui está um trecho de código que eu uso para limpar uma tabela. Basta alterar as informações de $ conn e TABLE_NAME.
fonte