PostgreSQL删除所有内容


Answers:



112

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

表订单引用表客户,表loyalty_cards引用表客户。当您尝试从其他表引用的表中截断/删除(其他表具有对指定表的外键约束)时,会收到错误消息。要从所有三个表中删除内容,您必须命名所有这些表(顺序并不重要)

TRUNCATE customers, loyalty_cards, orders;

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

TRUNCATE customers CASCADE;

pgAdmin也是如此。右键单击客户表,然后选择截断级联。


TRUNCATE是ANSI SQL的一部分,并且在所有 DBMS 中受支持。我点击了链接,该文档未提及扩展。链接可能不正确或已过期?
曼戈

嗯,有趣。引用的文本仍然可以在这里找到:postgresql.org/docs/9.0/static/sql-delete.html,但是您是对的-9.1中的文档中没有。
vitfo '18 -4-11

34

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

DELETE FROM tbl;

没有WHERE条件。

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


5
什么是“小”,“中”和“大”(根据您的估计)?
杰克逊

3
@杰克逊:很难确切地指出,因为它取决于太多的变量。您可以运行一些测试以找到系统上的最佳位置。
欧文·布兰德斯特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.