173

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

4

4 回答 4

196

使用TRUNCATE TABLE命令。

于 2012-11-04T22:55:50.973 回答
156

可以通过多种方式删除 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 从一组表中快速删除所有行。它与每个表上的非限定 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);

表orders 引用表customers 和表loyality_cards 引用表customers。当您尝试从其他表引用的表中截断/删除时(其他表对命名表有外键约束),您会收到错误消息。要从所有三个表中删除内容,您必须命名所有这些表(顺序不重要)

TRUNCATE customers, loyalty_cards, orders;

或者只是使用 CASCADE 关键字引用的表(您可以命名更多的表而不仅仅是一个)

TRUNCATE customers CASCADE;

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

于 2014-08-07T13:31:03.777 回答
47

对于小型DELETE,通常速度更快,并且需要较少积极的锁定(对于繁重的并发负载):

DELETE FROM tbl;

没有WHERE条件。

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

于 2012-11-05T05:10:51.807 回答
4

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

enter image description here

And if you have foreign keys, select also CASCADE option on Settings panel. Start and that's all it takes!

于 2021-04-20T11:38:28.283 回答