Eu regularmente preciso excluir todos os dados do meu banco de dados PostgreSQL antes de uma reconstrução. Como eu faria isso diretamente no SQL?
No momento, consegui criar uma instrução SQL que retorne todos os comandos que preciso executar:
SELECT 'TRUNCATE TABLE ' || tablename || ';' FROM pg_tables WHERE tableowner='MYUSER';
Mas não consigo ver uma maneira de executá-los programaticamente depois que os tiver.
DECLARE r RECORD;
então for loop:FOR r IN SELECT tablename FROM pg_tables LOOP
Cursores explícitos raramente são necessários no plpgsql. Use o cursor implícito mais simples e rápido de um
FOR
loop:Nota: Como os nomes das tabelas não são exclusivos por banco de dados, é necessário qualificar os nomes das tabelas para garantir o esquema. Além disso, limito a função ao esquema padrão 'público'. Adapte-se às suas necessidades, mas certifique-se de excluir os esquemas do sistema
pg_*
einformation_schema
.Tenha muito cuidado com essas funções. Eles danificam seu banco de dados. Eu adicionei um dispositivo de segurança infantil. Comente a
RAISE NOTICE
linha e descomenteEXECUTE
para preparar a bomba ...format()
requer o Postgres 9.1 ou posterior. Nas versões mais antigas, concatenar a cadeia de consulta da seguinte maneira:Comando único, sem loop
Como podemos criar
TRUNCATE
várias tabelas ao mesmo tempo, não precisamos de nenhum cursor ou loop:Agregue todos os nomes de tabela e execute uma única instrução. Mais simples, mais rápido:
Ligar:
Consulta refinada
Você nem precisa de uma função. No Postgres 9.0+, você pode executar comandos dinâmicos em uma
DO
instrução. E no Postgres 9.5+, a sintaxe pode ser ainda mais simples:Sobre a diferença entre
pg_class
,pg_tables
einformation_schema.tables
:Sobre
regclass
e citou nomes de tabelas:Para uso repetido
Crie um banco de dados "modelo" (vamos chamá-lo
my_template
) com sua estrutura de baunilha e todas as tabelas vazias. Em seguida, passe por um cicloDROP
/CREATE DATABASE
:Isso é extremamente rápido , porque o Postgres copia toda a estrutura no nível do arquivo. Não há problemas de simultaneidade ou outras sobrecargas que o tornam mais lento.
Se conexões simultâneas impedirem que você elimine o banco de dados, considere:
fonte
DROP DATABASE mydb
, obviamente). Você está confundindo esquemas com bancos de dados, talvez?DO
comando (como qualquer outra instrução SQL) é executado exclusivamente no banco de dados atual . O Postgres não tem como acessar outros bancos de dados na mesma transação. Você precisaria usar dblink ou FDW para fazer isso. Mas não afeta todos os esquemas no banco de dados atual - a menos que você adicionarWHERE t.schemaname = 'public'
para restringir o efeito a um esquema específico, neste caso particular.Se eu tiver que fazer isso, simplesmente criarei um esquema sql do banco de dados atual, depois solto e cria o banco de dados e carrego o banco de dados com o esquema sql.
Abaixo estão as etapas envolvidas:
1) Criar dump de esquema do banco de dados (
--schema-only
)pg_dump mydb -s > schema.sql
2) Soltar banco de dados
drop database mydb;
3) Criar banco de dados
create database mydb;
4) Esquema de importação
psql mydb < schema.sql
fonte
Nesse caso, provavelmente seria melhor ter apenas um banco de dados vazio usado como modelo e, quando precisar atualizar, descarte o banco de dados existente e crie um novo a partir do modelo.
fonte
Você poderia usar o SQL dinâmico para executar cada instrução por sua vez? Você provavelmente teria que escrever um script PL / pgSQL para fazer isso.
http://www.postgresql.org/docs/8.3/static/plpgsql-statements.html (seção 38.5.4. Executando comandos dinâmicos)
fonte
Você pode fazer isso com o bash também:
Você precisará ajustar nomes, senhas e nomes de usuário de esquemas para corresponder aos seus esquemas.
fonte
AUTO_INCREMENT
Versão de limpeza :fonte
Pessoal, a maneira melhor e limpa é:
1) Criar dump de esquema do banco de dados (--schema-only) pg_dump mydb -s> schema.sql
2) Soltar banco de dados soltar banco de dados mydb;
3) Criar banco de dados criar banco de dados mydb;
4) Importar esquema psql mydb <schema.sql
É trabalho pra mim!
Tenha um bom dia. Hiram Walker
fonte
Se você pode usar o psql, pode usar o
\gexec
comando meta para executar a saída da consulta;Observe que
\gexec
é introduzido na versão 9.6fonte
Para remover os dados e preservar as estruturas de tabela no pgAdmin, você pode:
fonte