Como posso eliminar todas as tabelas no PostgreSQL, trabalhando na linha de comando?
Eu não quero largar o próprio banco de dados, apenas a todas as tabelas e todos os dados em si.
postgresql
AP257
fonte
fonte
public
, você perde todas as extensões instaladas.Respostas:
Se todas as suas tabelas estiverem em um único esquema, essa abordagem poderá funcionar (o código abaixo assume que o nome do seu esquema é
public
)Se você estiver usando o PostgreSQL 9.3 ou superior, também poderá ser necessário restaurar as concessões padrão.
fonte
pg_
), pois estão em um esquema diferentepg_catalog
.GRANT ALL ON SCHEMA public TO public;
após a criação.GRANT ALL
após a criação?Você pode escrever uma consulta para gerar um script SQL como este:
Ou:
Caso algumas tabelas sejam eliminadas automaticamente devido à opção em cascata em uma frase anterior.
Além disso, conforme indicado nos comentários, convém filtrar as tabelas que deseja excluir pelo nome do esquema:
E depois execute.
Glorioso COPY + PASTE também funcionará.
fonte
drop schema public cascade;
, mas quase sempre tem permissão para descartar tabelas.A resposta mais aceita até o momento em que este artigo foi escrito (janeiro de 2014) é:
Isso funciona, no entanto, se sua intenção é restaurar o esquema público para seu estado virgem, isso não realiza completamente a tarefa. No pgAdmin III para PostgreSQL 9.3.1, se você clicar no esquema "público" criado dessa maneira e procurar no "painel SQL", verá o seguinte:
No entanto, por outro lado, um novo banco de dados terá o seguinte:
Para mim, usando um framework web python que cria tabelas de banco de dados (web2py), o uso dos primeiros causou problemas:
Então, na minha opinião, a resposta totalmente correta é:
Observe também que para emitir esses comandos no pgAdmin III, usei a ferramenta Query (ícone da lupa "Executar consultas SQL abritrárias") ou você pode usar Plugins-> PSQL Console
Nota
Se você tiver alguma extensão instalada, ela será descartada quando você soltar o esquema; portanto, anote o que você precisa instalar e execute as instruções conforme necessário. Por exemplo
CREATE EXTENSION postgis;
fonte
drop
entãocreate
) costumava funcionar no PostgreSQL 9.1. Após a atualização para 9.3, os dois extrasgrant
são necessários.Você pode soltar todas as tabelas com
Para a IMO, é melhor que isso
drop schema public
, porque você não precisa recriarschema
e restaurar todas as concessões.Bônus adicional por não exigir linguagem de script externa nem copiar e colar o SQL gerado de volta ao intérprete.
fonte
drop schema
truque, pois o usuário não era proprietário do esquema, apenas das tabelas. Este trabalhou embora :)EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE';
com este:EXECUTE format('DROP TABLE IF EXISTS %I CASCADE', quote_ident(r.tablename));
Se tudo o que você deseja soltar pertence ao mesmo usuário, você pode usar:
Isso descartará tudo o que o usuário possui.
Isso inclui visualizações materializadas, visualizações, sequências, gatilhos, esquemas, funções, tipos, agregados, operadores, domínios e assim por diante (então, realmente: tudo ) que
the_user
possui (= criado).Você precisa substituir
the_user
pelo nome de usuário real. Atualmente, não há opção de descartar tudo para "o usuário atual". A próxima versão 9.5 terá a opçãodrop owned by current_user
.Mais detalhes no manual: http://www.postgresql.org/docs/current/static/sql-drop-owned.html
fonte
public
esquema são de propriedade depostgres
, mas todo o resto pertence a um usuário específico; assim, eliminar tudo o que é de propriedade do usuário limpa o banco de dados, exceto o esquema.Conforme Pablo acima, para sair apenas de um esquema específico, com relação ao caso:
fonte
where schemaname='public'
parte seja significativa?deve fazer o truque.
fonte
CREATE SCHEMA public;
. Ver também stackoverflow.com/a/14286370 para mais informaçõesSeguindo Pablo e LenW, aqui está uma lista que faz tudo ao mesmo tempo preparando e executando:
psql -U $PGUSER $PGDB -t -c "select 'drop table \"' || tablename || '\" cascade;' from pg_tables where schemaname = 'public'" | psql -U $PGUSER $PGDB
NB: defina ou substitua
$PGUSER
e$PGDB
com os valores desejadosfonte
Se você tiver a linguagem procedural PL / PGSQL instalada, poderá usar o seguinte para remover tudo sem um script externo shell / Perl.
Em vez de digitar isso no prompt "psql", sugiro que você o copie para um arquivo e depois passe o arquivo como entrada para o psql usando as opções "--file" ou "-f":
Crédito onde o crédito é devido: eu escrevi a função, mas acho que as consultas (ou a primeira pelo menos) vieram de alguém de uma das listas de discussão do pgsql anos atrás. Não lembro exatamente quando ou qual.
fonte
Se você quiser destruir todas as tabelas de qualquer maneira, poderá dispensar detalhes, como CASCADE, colocando todas as tabelas em uma única instrução. Isso também torna a execução mais rápida.
Executando-o diretamente:
Substitua
TRUNCATE
porDROP
conforme aplicável.fonte
public
esquema, não esqueça de incluir o nome do esquema na expressão: emstring_agg(quote_ident(schemaname) || '.' || quote_ident(tablename), ', ')
vez de simplesmente passar os nomes da tabela.Modifiquei ligeiramente a resposta de Pablo para a conveniência de ter os comandos SQL gerados retornados como uma única sequência:
fonte
Use este script no pgAdmin:
fonte
Apenas no caso ... Script Python simples que limpa o banco de dados Postgresql
Certifique-se de que, após copiá-lo, o recuo esteja correto, pois o Python depende dele.
fonte
Você pode usar a função string_agg para criar uma lista separada por vírgulas, perfeita para DROP TABLE. Em um script bash:
fonte
Se você deseja excluir dados (não excluir tabela):
Ou, se você quiser soltar a tabela, poderá usar este sql:
fonte
Nota: minha resposta é sobre realmente excluir as tabelas e outros objetos de banco de dados; para apagar todos os dados em tabelas, ou seja truncar todas as tabelas , Endre Ambos forneceu uma declaração similarily bem executado (execução direta), um mês depois.
Para os casos em que você não pode simplesmente
DROP SCHEMA public CASCADE;
,DROP OWNED BY current_user;
ou algo assim, aqui está um script SQL independente que eu escrevi, que é seguro para transações (ou seja, você pode colocá-lo entreBEGIN;
eROLLBACK;
apenas para testá-lo ouCOMMIT;
realmente fazer a ação) e limpa “todos” os objetos do banco de dados ... bem, todos aqueles usados no banco de dados que nosso aplicativo usa ou eu poderia acrescentar sensatamente, que é:CHECK
,UNIQUE
)VIEW
s (normal ou materializado)public
ou internos ao banco de dados) "nós" possuímos: o script é útil quando executado como "não um superusuário de banco de dados"; um superusuário pode eliminar todos os esquemas (os realmente importantes ainda são explicitamente excluídos)Não são descartados (alguns deliberados; outros apenas porque eu não tinha exemplo em nosso banco de dados):
public
esquema (por exemplo, para itens fornecidos por extensão)Isso é realmente útil para os casos em que o dump que você deseja restaurar é de uma versão de esquema de banco de dados diferente (por exemplo, com Debian
dbconfig-common
, Flyway ou Liquibase / DB-Manul) do que o banco de dados no qual você deseja restaurá-lo.Eu também tenho uma versão que exclui "tudo, exceto duas tabelas e o que lhes pertence" (uma sequência, testada manualmente, desculpe, eu sei, chata) no caso de alguém estar interessado; o diff é pequeno. Entre em contato comigo ou consulte este repositório, se estiver interessado.
SQL
Testado, exceto adições posteriores (
extensions
contribuído por Clément Prévost ), no PostgreSQL 9.6 (jessie-backports
). Remoção agregada testada em 9.6 e 12.2, remoção de procedimento testada em 12.2 também. Correções de bugs e melhorias adicionais são bem-vindas!fonte
DROP FUNCTION
falha em um procedimento e vice-versa. Eu modifiquei a seção de função para isso:AND pp.prokind ='f' -- Function
ouAND pp.prokind ='p' -- Procedure
proisagg
) em ≤ 10.x e agregados e procedimentos (prokind
) em ≥ 11 (verificado dinamicamente) e testei os dois ☻ obrigado pela dica.Essa é uma pergunta realmente interessante, e você poderá fazer isso de várias maneiras. Espero que isso seja útil para você.
Aqui, em geral, temos um
public
esquema por padrão. Então, eu estou usando isso como uma instância.Se você estiver usando o PostgreSQL 9.3 ou superior, também poderá ser necessário restaurar as concessões padrão.
Isso limpará um esquema inteiro e o recriará como um novo.
Você vai perder outras entidades também como
Functions
,Views
,Materialized views
, etc.O PostgreSQL armazena todas as tabelas em sua tabela de registro denominada
pg_table
.Como você pode ver, pelo uso da subconsulta, podemos remover todas as tabelas do esquema.
Quando as outras entidades de dados são importantes e você deseja excluir apenas as tabelas do esquema, essa abordagem será realmente útil para você.
fonte
Você precisa soltar tabelas e sequências, eis o que funcionou para mim
antes de executar o comando que você pode precisar sudo / su aos
postgres
usuários ou (detalhes de conexão de exportaçãoPGHOST
,PGPORT
,PGUSER
ePGPASSWORD
) e, em seguida,export PGDATABASE=yourdatabase
fonte
Tarefa Rake para Rails para destruir todas as tabelas no banco de dados atual
fonte
rake db:create
, eu corro. Você pode fazer a ponta Steve e remover o códigotable_name =
e mudança", "
para","
e#{ tables }
fo#{tables}
As etapas a seguir podem ser úteis (para usuários Linux):
Primeiro, digite o
postgres
prompt de comando, seguindo o comando:Digite o banco de dados por este comando (o nome do meu banco de dados é
maoss
:):Agora digite o comando para descartar todas as tabelas:
fonte
Aprimorei o método bash de jamie cuidando das visualizações, porque ele só respeita o tipo de tabela "tabela base", que é o padrão.
O seguinte código bash exclui as visualizações primeiro e depois todo o resto
fonte
psql -d $PGDB -t --command "SELECT string_agg(sequence_name, ',') FROM information_schema.sequences WHERE sequence_schema='public' AND sequence_catalog='$PGDB'"
em um arquivo em lotes do Windows:
fonte
bem, desde que eu gosto de trabalhar na linha de comando ...
psql -U <user> -d <mydb> -c '\dt' | cut -d ' ' -f 4 | sed -e "s/^/drop table if exists /" | sed -e "s/$/;/"
-c '\dt'
chamará o comando list tables.List of relations Schema | Name | Type | Owner --------+-------------------+-------+---------- public | _d_psidxddlparm | table | djuser public | _d_psindexdefn | table | djuser
cut -d ' ' -f 4
agora, canalize sua saída para pegar o quarto campo (ao usar o espaço como separador), que é a tabela.sed
é então utilizado como prefixo adrop table
e sufixo o;
separador de comandos.| egrep '_d_'
- Coloque umgrep
pouco mais e você poderá ser mais seletivo sobre as tabelas que você solta.drop table if exists _d_psidxddlparm; drop table if exists _d_psindexdefn;
Nota: conforme escrito, isso gerará linhas falsas para a
\dt
saída dos comandos dos cabeçalhos das colunas e o total de linhas no final. Evito isso grepping, mas você pode usarhead
etail
.fonte
A maneira mais fácil é abandonar o esquema público, como outros sugeriram nas respostas anteriores. No entanto, este não é um bom caminho. Você nunca sabe o que foi feito com o esquema público que foi esquecido e não foi documentado. Você também não sabe se isso funcionará da mesma maneira no futuro. Na V9, teria sido bom, mas na V10 todos os usuários perderiam o acesso ao esquema e devem ter acesso concedido novamente, caso contrário, seu aplicativo será interrompido. Eu não verifiquei a V11, mas o ponto é que você nunca sabe o que será interrompido ao passar de máquina para máquina, site para site ou versão para versão. Isso também não pode ser feito se você for um usuário que tenha acesso ao banco de dados, mas não ao esquema.
Se você precisar fazer isso de forma programática, as outras respostas acima abordarão isso, mas uma coisa que as respostas acima não consideram é fazer com que o Postgres faça o trabalho para você. Se você usar pg_dump com a opção -c como abaixo:
Isso criará um script de restauração do banco de dados com instruções sql que excluirá todas as tabelas.
Se o único objetivo ao fazer a pergunta era excluir as tabelas antes da restauração, sua restauração fará o trabalho por você.
No entanto, se você precisar de algo mais, poderá simplesmente copiar as instruções drop do script sql.
fonte