PostgreSQL删除所有内容

时间:2012-11-04 22:53:37

标签: postgresql

您好我想删除postgresql表中的所有数据,但不删除表本身。 我怎么能这样做?

4 个答案:

答案 0 :(得分:92)

使用TRUNCATE TABLE命令。

答案 1 :(得分:76)

可以通过多种方式删除PostgreSQL数据库中表/表的内容。

使用sql删除表内容:

删除一个表的内容:

TRUNCATE table_name;
DELETE FROM table_name;

删除所有已命名表格的内容:

TRUNCATE table_a, table_b, …, table_z;

删除引用它们的命名表和表的内容(我将在本答案后面详细解释):

TRUNCATE table_a, table_b CASCADE;

使用pgAdmin删除表格内容:

删除一个表的内容:

Right click on the table -> Truncate

删除引用它的表和表的内容:

Right click on the table -> Truncate Cascaded

删除和截断之间的区别:

来自文档:

  

DELETE删除满足指定WHERE子句的行   表。如果不存在WHERE子句,则效果是删除所有行   在表中。   http://www.postgresql.org/docs/9.3/static/sql-delete.html

     

TRUNCATE是一个PostgreSQL扩展,提供了更快的机制   从表中删除所有行。 TRUNCATE快速删除a中的所有行   一组表。它与每个上的非限定DELETE具有相同的效果   表,但由于它实际上不扫描表格,因此速度更快。   此外,它立即回收磁盘空间,而不是要求   随后的VACUUM操作。这对大型表最有用。   http://www.postgresql.org/docs/9.1/static/sql-truncate.html

使用从其他表引用的表:

当您拥有包含多个表的数据库时,表可能具有关系。 例如,有三个表:

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)
);

这些表的一些准备数据:

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);

表命令引用表客户和表loyalty_cards引用表客户。当您尝试TRUNCATE / DELETE FROM其他表引用的表(其他表/ s具有指定表的外键约束)时,您会收到错误。要删除所有三个表中的内容,您必须为所有这些表命名(顺序并不重要)

TRUNCATE customers, loyalty_cards, orders;

或仅使用CASCADE关键字引用的表(您可以命名的表格多于一个)

TRUNCATE customers CASCADE;

同样适用于pgAdmin。右键单击customers表并选择Truncate Cascaded。

答案 2 :(得分:26)

对于小型DELETE通常更快,并且需要更少的主动锁定(对于繁重的并发负载):

DELETE FROM tbl;

没有WHERE条件。

对于中等或更大的表,请使用TRUNCATE tbl,例如@Greg发布。

答案 3 :(得分:0)

我为可能使用 DBeaver 等工具的每个人找到了一种非常简单快捷的方法: 您只需要选择要截断的所有表(SHIFT + clickCTRL + click)然后 right click

enter image description here

如果您有外键,还可以在 CASCADE 面板上选择 Settings 选项。 Start 就是这样!