
# TRUNCATE
#### 功能描述
TRUNCATE语法用于清理表数据，快速地从表中删除所有行。
它与在目标表上进行无条件的DELETE的效果相同，但由于TRUNCATE实际上并不扫描表，因此速度更快，尤其在大表上操作效果更明显。
#### TRUNCATE TABLE、DELETE TABLE和DROP TABLE差异
表1TRUNCATE TABLE、DELETE TABLE和DROP TABLE差异 
| 差异类别   | TRUNCATE TABLE                                                                                      | DELETE TABLE                                                                | DROP TABLE        |
|:---|:---|:---|:---|
| 语法     | DDL                                                                                                 | DML                                                                         | DDL               |
| 删除内容   | 删除表中的所有数据，但不会删除表结构                                                                                  | 删除内容，不删除定义                                                                  | 删除内容和定义           |
| 是否释放空间 | 释放空间                                                                                                | 不释放空间                                                                       | 释放空间              |
| 执行速度   | 速度较快 释放存储表数据所用数据页来删除数据，并且只在事务日志中记录页的释放，使用系统和事务日志资源少。 | 速度慢 每删除一行，在事务日志中为所删除每行记录一项。 | 速度最快              |
| 适用场景   | 如果需要快速删除整个表中的数据，保留表结构，且是大批量数据的场景。                                                                   | 需要根据特定条件删除数据且数据量可控的情况。                                                      | 需要删除整个表，包括表结构和数据。 |
   
#### 注意事项
- 请谨慎执行TRUNCATE TABLE，确认表数据可以删除或者已有备份后，再执行删除操作。TRUNCATE TABLE命令删除表数据后，数据将无法恢复。

- TRUNCATE全局临时表只对当前会话的数据进行TRUNCATE。不影响其他会话的数据。
- 存算分离架构下，不支持同时TRUNCATE普通表和临时表。
![](https://support.huaweicloud.com/sqlreference-dws/public_sys-resources/warning_3.0-zh-cn.png)
- 避免在业务高峰期执行ALTER TABLE/ALTER TABLE PARTITION（增删改查、DROP PARTITION）、TRUNCATE操作，避免有长SQL阻塞ALTER、TRUNCATE操作或SQL业务被ALTER、TRUNCATE阻塞。
- 更多开发设计规范参见[总体开发设计规范](https://support.huaweicloud.com/devg-dws/dws_04_0075.html)。
 
#### 语法格式
清理表数据。
```
TRUNCATE [ TABLE ] [ ONLY ] {[[database_name.]schema_name.]table_name [ * ]} [, ... ]
    [ CONTINUE IDENTITY ] [ CASCADE | RESTRICT ] ;
```
#### 参数说明
表2TRUNCATE参数说明 
| 参数                  | 描述                                                                                | 取值范围                                                                                                                                                                                                                                                                                                                                                  |
|:---|:---|:---|
| ONLY                | 指定清空表的范围。 该参数仅为了兼容PG保留，DWS不支持继承表。 | - 如果指定ONLY，则只有指定表会被清空。  - 如果没有指定ONLY，则指定表及其所有继承表（若有）都会被清空。                                            |
| database_name       | 要清空的表所在的数据库名称。                                                                    | 已存在的数据库名。                                                                                                                                                                                                                                                                                                                                             |
| schema_name         | 要清空的表的模式名称。                                                                       | 已存在的模式名。                                                                                                                                                                                                                                                                                                                                              |
| table_name          | 指定要清空的表名（可以用模式修饰）。                                                                | 已存在的表名。                                                                                                                                                                                                                                                                                                                                               |
| CONTINUE IDENTITY   | 不更改序列的值。                                                                          | 该参数为缺省值。                                                                                                                                                                                                                                                                                                                                              |
| CASCADE \| RESTRICT | 可选参数，清空有外键引用的表的方式。                                                                | - CASCADE：表示级联清空所有在该表上有外键引用的表，或者由于CASCADE而被添加到组中的表。  - RESTRICT：表示如果其他表在该表上有外键引用，则拒绝清空。   缺省值为RESTRICT。 |
   
#### 示例
1. 创建示例表test_t并插入数据。
   ```
   DROP TABLE IF EXISTS test_t;
   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的数据。
   ```
   SELECT * FROM test_t;
   ```
   ![](https://support.huaweicloud.com/sqlreference-dws/figure/zh-cn_image_0000002624990338.png "点击放大")
   
3. 清理表test_t。
   ```
   TRUNCATE test_t;
   ```
   返回结果如下，表示已成功清理。
   ![](https://support.huaweicloud.com/sqlreference-dws/figure/zh-cn_image_0000002624990554.png "点击放大")
   
4. 查看表定义。TRUNCATE TABLE操作清空表，保留表定义。
   ```
   SELECT * FROM pg_get_tabledef('public.test_t');
   ```
   ![](https://support.huaweicloud.com/sqlreference-dws/figure/zh-cn_image_0000002624990560.png "点击放大")
   
 
