PostgreSQL 教程: TRUNCATE TABLE 截断表

九月 11, 2023

摘要:在本教程中,您将学习如何使用 PostgreSQL 的TRUNCATE TABLE语句快速删除大型表中的所有数据。

PostgreSQL TRUNCATE TABLE 语句简介

要从表中删除所有数据,你会使用DELETE语句。但是,当使用DELETE语句从数据量很大的表中删除所有数据时,效率并不高。在这种情况下,您需要使用TRUNCATE TABLE语句:

TRUNCATE TABLE table_name;

TRUNCATE TABLE语句删除表中的所有数据而不扫描它。这就是它比DELETE语句更快的原因。

此外,TRUNCATE TABLE语句会立即回收存储空间,因此您不必执行后续的VACUMM操作,这在大型表的情况下很有用。

删除一张表中的所有数据

TRUNCATE TABLE语句最简单的形式如下:

TRUNCATE TABLE table_name;

以下示例使用TRUNCATE TABLE语句删除invoices表中的所有数据:

TRUNCATE TABLE invoices;

除了删除数据之外,您可能还想使用RESTART IDENTITY选项重置标识列中的值,如下:

TRUNCATE TABLE table_name 
RESTART IDENTITY;

例如,以下语句从invoices表中删除所有行,并重置与invoice_no列关联的序列

TRUNCATE TABLE invoices 
RESTART IDENTITY;

默认情况下,TRUNCATE TABLE语句使用CONTINUE IDENTITY选项。该选项基本上不会重启与表中的列关联的序列值。

删除多个表中的所有数据

要一次从多个表中删除所有数据,请用逗号 (,) 分隔每个表,如下所示:

TRUNCATE TABLE 
    table_name1, 
    table_name2,
    ...;

例如,以下语句删除invoicescustomers表中的所有数据:

TRUNCATE TABLE invoices, customers;

从有外键引用的表中删除所有数据

在实践中,您要截断的表通常具有在TRUNCATE TABLE语句中未列出的其他表的外键引用。

默认情况下,TRUNCATE TABLE语句不会从具有外键引用的表中删除任何数据。

要从表和具有外键引用该表的其他表中删除数据,可以在TRUNCATE TABLE语句中使用CASCADE选项,如下所示:

TRUNCATE TABLE table_name 
CASCADE;

以下示例从invoices表以及通过外键约束引用invoices表的其他表中删除数据:

TRUNCATE TABLE invoices CASCADE;

使用CASCADE 选项时应进一步考虑,否则您可能会从表中删除不需要的数据。

默认情况下,TRUNCATE TABLE语句使用RESTRICT选项,阻止您截断具有外键约束引用的表。

PostgreSQL TRUNCATE TABLE 和 ON DELETE 触发器

即使TRUNCATE TABLE语句从表中删除所有数据,它也不会触发与该表关联的任何ON DELETE 触发器

要在TRUNCATE TABLE命令应用于表时触发触发器,您必须为该表定义BEFORE TRUNCATE和/或AFTER TRUNCATE触发器。

PostgreSQL TRUNCATE TABLE 和事务

TRUNCATE TABLE是事务安全的。这意味着如果您将其放入事务中,则可以安全地将其回滚。

概括

  • 使用TRUNCATE TABLE语句删除大表中的所有数据。

  • 使用CASCADE选项可以截断表以及通过外键约束引用该表的其他表。

  • TRUNCATE TABLE不触发ON DELETE触发器。相反,它会触发BEFORE TRUNCATEAFTER TRUNCATE触发器。

  • TRUNCATE TABLE语句是事务安全的。