在 PostgreSQL 中,TRUNCATE TABLE 用于快速删除表中的所有行,并释放存储空间,但保留表的结构(列、约束等)。相对于使用 DELETE FROM,TRUNCATE TABLE 是一个更快速且资源消耗更少的操作,因为它不会逐行删除数据,而是直接截断表。

基本语法如下:
TRUNCATE TABLE table_name;

其中,table_name 是要截断的表的名称。

请注意以下几点:

1. TRUNCATE 与 DELETE 的区别:
   
   - DELETE FROM table_name; 将逐行删除表中的数据,会生成大量的日志,并且可能触发触发器等。
   
   - TRUNCATE TABLE table_name; 以一种更高效的方式截断表,删除所有行,但不会逐行操作,因此速度更快。但要注意,TRUNCATE 不触发 ON DELETE 触发器,因此在需要触发器执行的情况下,可能需要使用 DELETE。

2. 保留序列值:
   
   默认情况下,TRUNCATE 会保留与序列相关联的序列值。这意味着下一次插入到表中时,序列将继续生成下一个值。如果要重置序列值,可以使用 RESTART IDENTITY 选项:
   TRUNCATE TABLE table_name RESTART IDENTITY;

   这将重新设置与表关联的序列的当前值。

3. 权限:

   执行 TRUNCATE TABLE 需要适当的权限,通常是表的所有者或拥有足够权限的用户。

例子:
-- 创建一个示例表
CREATE TABLE example_table (
    id serial PRIMARY KEY,
    name VARCHAR(100)
);

-- 插入一些数据
INSERT INTO example_table (name) VALUES ('John'), ('Alice'), ('Bob');

-- 使用 TRUNCATE 截断表
TRUNCATE TABLE example_table;

-- 此时表中的数据已经被删除,但表结构保持不变

请注意,TRUNCATE TABLE 是一个 DDL(数据定义语言)命令,因此在执行后会自动提交事务。如果你在事务中执行 TRUNCATE TABLE,它会立即生效,而不需要显式提交。


转载请注明出处:http://www.pingtaimeng.com/article/detail/14148/PostgreSQL