TRUNCATE 语句

最近更新时间:2026-05-06 16:28:13

我的收藏
TRUNCATE TABLE 用于高效地清空表中的所有数据,同时保留表的定义(Schema)和结构。

语法

TRUNCATE [TABLE] [IF EXISTS] [db_name.]table_name

使用说明

核心用途:常用于 ETL 流程中清空中间表或临时表。相比于删除并重建表,或使用 INSERT OVERWRITETRUNCATE 是一种低开销、高性能的方法。
适用范围
删除表中的所有数据及其相关的物理数据文件。
支持内表、外表、分区表。
操作适用于全表,会自动处理所有分区的数据。
副作用:执行后,由 COMPUTE STATS 生成的所有表统计信息和列统计信息将被重置(清空)。
安全建议
在执行前确保位于正确的数据库(使用 USE 切换),或使用全限定名(db.table)。
IF EXISTS:此子句可防止因表不存在而报错,非常适合放在自动化脚本或标准化 ETL 设置脚本中。
可选关键字TABLE 关键字是可选的,不影响执行逻辑。

示例

清空数据并重置统计信息

以下示例展示了 TRUNCATE 如何在清空数据的同时重置统计信息。
-- 1. 准备数据并收集统计信息
CREATE TABLE truncate_demo (x INT);
INSERT INTO truncate_demo VALUES (1), (2), (4), (8);

-- TCHouse-X 数据写入后可见性约为 10s,建议至少等待 10s 后再执行后续操作。
COMPUTE STATS truncate_demo;

-- 查看统计信息:此时有 4 行数据
SHOW TABLE STATS truncate_demo;
-- +-------+--------+------+--------+
-- | #Rows | #Files | Size | Format |
-- +-------+--------+------+--------+
-- | 4 | 1 | 420B | TCI |
-- +-------+--------+------+--------+

-- 2. 执行清空操作
TRUNCATE TABLE truncate_demo;

-- 3. 验证结果:数据和统计信息均被清空
SELECT COUNT(*) FROM truncate_demo; -- 返回 0

SHOW TABLE STATS truncate_demo;
-- +--------+--------+------+--------+
-- | #Rows | #Files | Size | Format |
-- +--------+--------+------+--------+
-- | -1 | 0 | 0B | TCI |
-- +--------+--------+------+--------+

在自动化脚本中使用 IF EXISTS

该子句允许脚本在表可能不存在的情况下继续运行而不中断。
-- 即使 staging_table2 和 3 不存在,脚本也不会报错
TRUNCATE TABLE IF EXISTS staging_table1;
TRUNCATE TABLE IF EXISTS staging_table2;
TRUNCATE TABLE IF EXISTS staging_table3;

TRUNCATE vs DELETE 快速对比

特性
TRUNCATE TABLE
DELETE
操作粒度
全表清空
可根据条件精确删除 (WHERE)
性能
极高(直接物理删除文件)
较低(逐行或按主键范围删除)
主键要求
无要求,支持各类表
仅支持主键表
统计信息
自动重置
保留统计信息(需手动重置)