TRUNCATE
功能描述
TRUNCATE语法用于清理表数据,快速地从表中删除所有行。
它与在目标表上进行无条件的DELETE的效果相同,但由于TRUNCATE实际上并不扫描表,因此速度更快,尤其在大表上操作效果更明显。
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 ] ; |
参数说明
参数 |
描述 |
取值范围 |
---|---|---|
ONLY |
指定清空表的范围。 该参数仅为了兼容PG保留,DWS不支持继承表。 |
|
database_name |
要清空的表所在的数据库名称。 |
已存在的数据库名。 |
schema_name |
要清空的表的模式名称。 |
已存在的模式名。 |
table_name |
指定要清空的表名(可以用模式修饰)。 |
已存在的表名。 |
CONTINUE IDENTITY |
不更改序列的值。 |
该参数为缺省值。 |
CASCADE | RESTRICT |
可选参数,清空有外键引用的表的方式。 |
缺省值为RESTRICT。 |
示例
- 创建示例表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');
- 查看表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)
- 清理表test_t。
1
TRUNCATE test_t;
返回结果如下,表示已成功清理。
1
TRUNCATE TABLE
- 查看表定义。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)