PostgreSQL exclui todo o conteúdo

Respostas:

114

O conteúdo da tabela / tabelas no banco de dados PostgreSQL pode ser excluído de várias maneiras.

Excluindo o conteúdo da tabela usando sql:

Excluindo o conteúdo de uma tabela:

TRUNCATE table_name;
DELETE FROM table_name;

Excluindo o conteúdo de todas as tabelas nomeadas:

TRUNCATE table_a, table_b, …, table_z;

Excluindo o conteúdo de tabelas nomeadas e tabelas que fazem referência a elas (explicarei com mais detalhes posteriormente nesta resposta):

TRUNCATE table_a, table_b CASCADE;

Excluindo o conteúdo da tabela usando pgAdmin:

Excluindo o conteúdo de uma tabela:

Right click on the table -> Truncate

Excluindo o conteúdo da tabela e as tabelas que fazem referência a ele:

Right click on the table -> Truncate Cascaded

Diferença entre excluir e truncar:

Da documentação:

DELETE exclui linhas que satisfazem a cláusula WHERE da tabela especificada. Se a cláusula WHERE estiver ausente, o efeito é excluir todas as linhas da tabela. http://www.postgresql.org/docs/9.3/static/sql-delete.html

TRUNCATE é uma extensão do PostgreSQL que fornece um mecanismo mais rápido para remover todas as linhas de uma tabela. TRUNCATE remove rapidamente todas as linhas de um conjunto de tabelas. Tem o mesmo efeito que um DELETE não qualificado em cada tabela, mas, como não verifica as tabelas, é mais rápido. Além disso, ele recupera espaço em disco imediatamente, em vez de exigir uma operação VACUUM subsequente. Isso é mais útil em grandes tabelas. http://www.postgresql.org/docs/9.1/static/sql-truncate.html

Trabalhando com a tabela que é referenciada em outra tabela:

Quando você tem um banco de dados que possui mais de uma tabela, as tabelas provavelmente têm relacionamento. Como exemplo, existem três tabelas:

create table customers (
customer_id int not null,
name varchar(20),
surname varchar(30),
constraint pk_customer primary key (customer_id)
);

create table orders (
order_id int not null,
number int not null,
customer_id int not null,
constraint pk_order primary key (order_id),
constraint fk_customer foreign key (customer_id) references customers(customer_id)
);

create table loyalty_cards (
card_id int not null,
card_number varchar(10) not null,
customer_id int not null,
constraint pk_card primary key (card_id),
constraint fk_customer foreign key (customer_id) references customers(customer_id)
);

E alguns dados preparados para essas tabelas:

insert into customers values (1, 'John', 'Smith');

insert into orders values 
(10, 1000, 1),
(11, 1009, 1),
(12, 1010, 1);        

insert into loyalty_cards values (100, 'A123456789', 1);

Os pedidos da tabela fazem referência aos clientes da tabela e a tabela loyalty_cards faz referência aos clientes da tabela. Ao tentar TRUNCAR / EXCLUIR da tabela que é referenciada por outra (s) tabela (s) (a (s) outra (s) tabela (s) tem restrição de chave estrangeira para a tabela nomeada), você obtém um erro. Para excluir o conteúdo de todas as três tabelas, você deve nomear todas essas tabelas (a ordem não é importante)

TRUNCATE customers, loyalty_cards, orders;

ou apenas a tabela que é referenciada com a palavra-chave CASCADE (você pode nomear mais tabelas do que apenas uma)

TRUNCATE customers CASCADE;

O mesmo se aplica ao pgAdmin. Clique com o botão direito na tabela de clientes e escolha Truncar em cascata.

vitfo
fonte
TRUNCATEfaz parte do ANSI SQL e é compatível com todos os DBMS. Segui o link e o documento não menciona nada sobre extensões. Talvez o link esteja incorreto ou desatualizado?
Manngo
Hm, interessante. O texto citado ainda pode ser encontrado aqui: postgresql.org/docs/9.0/static/sql-delete.html mas você está certo - não está no doc para 9.1.
vitfo
34

Para tabelas pequenasDELETE é geralmente mais rápido e precisa de bloqueio menos agressivo (para carga simultânea pesada):

DELETE FROM tbl;

Sem WHEREcondição.

Para tabelas médias ou maioresTRUNCATE tbl , use, como postou @Greg.

Erwin Brandstetter
fonte
5
O que é "pequeno", "médio" e "maior" (na sua avaliação)?
Jackson
3
@Jackson: Isso é difícil de definir exatamente porque depende de muitas variáveis. Você pode executar alguns testes para encontrar o ponto ideal em seu sistema.
Erwin Brandstetter