九月 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,
...;
例如,以下语句删除invoices
和customers
表中的所有数据:
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 TRUNCATE
和AFTER TRUNCATE
触发器。 -
TRUNCATE TABLE
语句是事务安全的。