PostgreSQL TRUNCATE TABLE 清空表

在本文中,我们介绍了在 PostgreSQL 服务器上如何使用 TRUNCATE TABLE 语句清空一个或多个表。

当我们需要清空一个表中的所有行时,除了使用 DELETE * FROM table 还可以使用 TRUNCATE TABLE 语句。

TRUNCATE 语句和不带任何条件的 DELETE 语句的效果相同。但是 TRUNCATE 速度更快,因为它不扫描表。并且,TRUNCATE 会立即回收磁盘空间。 TRUNCATE 在清空大表时很有用。

PostgreSQL TRUNCATE 语法

要清空一个或者多个表中的所有的行,请按照以下语法使用使用 TRUNCATE 语句:

TRUNCATE [TABLE] [ONLY] table_name [ * ] [, ... ]
    [RESTART IDENTITY | CONTINUE IDENTITY] [ CASCADE | RESTRICT ]

解释说明:

  • TABLE 关键字是可选的。
  • ONLY 关键字是可选的。如果在表名前指定了 ONLY,则只清空此表,不包含它的子表。否则,此表和它的子表都将被清空。
  • table_name 是要清空的表的名字。 表名后的 * 明确的指示子表也将被清空。
  • 您可以在一个 TRUNCATE 语句中清空多个表。 多个表名使用逗号分隔。
  • RESTART IDENTITY 选项指示自动重置表中的列拥有的序列。 CONTINUE IDENTITY 选项指示不改变表中的序列的值,它是默认的。
  • CASCADE 选项指示同时清空那些通过外键引用 table_name 的表。 RESTRICT 选项指示如果有外键引用要清空的表,则拒绝操作。

PostgreSQL TRUNCATE 实例

我们通过以下实例比较 TRUNCATEDELETE 在清空一个表的效率。

首先,我们使用下面的语句创建一个 test_truncate 表用于测试:

CREATE TABLE test_truncate (
  v INTEGER
);

然后,使用下面的 sql 语句插入 1000 万条数据:

INSERT INTO test_truncate (v)
SELECT generate_series(1, 10000000) v;

为了观察查询语句消耗的时间,请先使用下面的命令打开计时:

\timing

通过以下 DELETE 语句删除表中的所有行:

DELETE FROM test_truncate;
DELETE 10000000
Time: 6566.458 ms (00:06.566)

上面是 DELETE 语句的返回结果。它显示了从表中删除 10000000 行,总共耗费 6566.458 毫秒。

再使用上面的 INSERT 语句重新插入 1000 万行后,通过以下 TRUNCATE TABLE 语句清空表:

TRUNCATE TABLE test_truncate;
TRUNCATE TABLE
Time: 31.785 ms

上面是 TRUNCATE TABLE 语句的返回结果。它显示了清空此表共耗费 31.785 毫秒。所以 TRUNCATEDELETE 快的多。

结论

在本文中,我们介绍了在 PostgreSQL 中如何使用 TRUNCATE TABLE 语句清空表。 TRUNCATE TABLEDELETE 速度快的多,它对于清空一个大表很有用。