更新时间:2025-08-04 GMT+08:00
分享

TRUNCATE

功能描述

TRUNCATE语法用于清理表数据,快速地从表中删除所有行。

它与在目标表上进行无条件的DELETE的效果相同,但由于TRUNCATE实际上并不扫描表,因此速度更快,尤其在大表上操作效果更明显。

TRUNCATE TABLE、DELETE TABLE和DROP TABLE差异

表1 TRUNCATE TABLE、DELETE TABLE和DROP TABLE差异

差异类别

TRUNCATE TABLE

DELETE TABLE

DROP TABLE

语法

DDL

DML

DDL

删除内容

删除表中的所有数据,但不会删除表结构

删除内容,不删除定义

删除内容和定义

是否释放空间

释放空间

不释放空间

释放空间

执行速度

速度较快

释放存储表数据所用数据页来删除数据,并且只在事务日志中记录页的释放,使用系统和事务日志资源少。

速度慢

每删除一行,在事务日志中为所删除每行记录一项。

速度最快

适用场景

如果需要快速删除整个表中的数据,保留表结构,且是大批量数据的场景。

需要根据特定条件删除数据且数据量可控的情况。

需要删除整个表,包括表结构和数据。

注意事项

  • 请谨慎执行TRUNCATE TABLE,确认表数据可以删除或者已有备份后,再执行删除操作。TRUNCATE TABLE命令删除表数据后,数据将无法恢复。
  • TRUNCATE全局临时表只对当前会话的数据进行TRUNCATE。不影响其他会话的数据。
  • 存算分离架构下,不支持同时TRUNCATE普通表和临时表。
  • 避免在业务高峰期执行ALTER TABLE/ALTER TABLE PARTITION(增删改查、DROP PARTITION)、TRUNCATE操作,避免有长SQL阻塞ALTER、TRUNCATE操作或SQL业务被ALTER、TRUNCATE阻塞。
  • 更多开发设计规范参见总体开发设计规范

语法格式

清理表数据。

1
2
TRUNCATE [ TABLE ] [ ONLY ] {[[database_name.]schema_name.]table_name [ * ]} [, ... ]
    [ CONTINUE IDENTITY ] [ CASCADE | RESTRICT ] ;

参数说明

表2 TRUNCATE参数说明

参数

描述

取值范围

ONLY

指定清空表的范围。

该参数仅为了兼容PG保留,DWS不支持继承表。

  • 如果指定ONLY,则只有指定表会被清空。
  • 如果没有指定ONLY,则指定表及其所有继承表(若有)都会被清空。

database_name

要清空的表所在的数据库名称。

已存在的数据库名。

schema_name

要清空的表的模式名称。

已存在的模式名。

table_name

指定要清空的表名(可以用模式修饰)。

已存在的表名。

CONTINUE IDENTITY

不更改序列的值。

该参数为缺省值。

CASCADE | RESTRICT

可选参数,清空有外键引用的表的方式。

  • CASCADE:表示级联清空所有在该表上有外键引用的表,或者由于CASCADE而被添加到组中的表。
  • RESTRICT:表示如果其他表在该表上有外键引用,则拒绝清空。

缺省值为RESTRICT。

示例

  1. 创建示例表test_t并插入数据。
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    CREATE TABLE test_t
    (
        col_id INT PRIMARY KEY, 
        col_number INT NOT NULL, 
        col_date DATE NOT NULL,
        col_price NUMERIC (10,2),
        col_status TEXT    
    ) 
    WITH (ORIENTATION = COLUMN)
    DISTRIBUTE BY HASH (col_id);
    
    INSERT INTO test_t VALUES
    (01,300,'2025-03-01',99.20,'sold'),
    (02,400,'2025-04-01',95.50,'sold'),
    (03,450,'2025-05-01',420.50,'sold'),
    (04,100,'2025-06-01',100.85,'restock');
    
  2. 查看表test_t的数据。
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT * FROM test_t;
     col_id | col_number |      col_date       | col_price | col_status
    --------+------------+---------------------+-----------+------------
          1 |        300 | 2025-03-01 00:00:00 |     99.20 | sold
          2 |        400 | 2025-04-01 00:00:00 |     95.50 | sold
          3 |        450 | 2025-05-01 00:00:00 |    420.50 | sold
          4 |        100 | 2025-06-01 00:00:00 |    100.85 | restock
    (4 rows)
    
  3. 清理表test_t。
    1
    TRUNCATE test_t;
    

    返回结果如下,表示已成功清理。

    1
    TRUNCATE TABLE
    
  4. 查看表定义。TRUNCATE TABLE操作清空表,保留表定义。
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    SELECT * FROM pg_get_tabledef('public.test_t');
                                      pg_get_tabledef
    -----------------------------------------------------------------------------------
     SET search_path = public;                                                        +
     CREATE  TABLE test_t (                                                           +
             col_id integer NOT NULL,                                                 +
             col_number integer NOT NULL,                                             +
             col_date timestamp(0) without time zone NOT NULL,                        +
             col_price numeric(10,2),                                                 +
             col_status text                                                          +
     )                                                                                +
     WITH (orientation=column, compression=middle, colversion=2.0, enable_delta=false)+
     DISTRIBUTE BY HASH(col_id)                                                       +
    ;
    (1 row)
    

相关文档