
# TRUNCATE
#### 功能描述
清理表数据，TRUNCATE快速地从表中删除所有行。
它和在目标表上进行无条件的DELETE有同样的效果，但由于TRUNCATE不做表扫描，因而快得多。在大表上操作效果更明显。
#### 注意事项
- TRUNCATE TABLE在功能上与不带WHERE子句DELETE语句相同：二者均删除表中的全部行。
- TRUNCATE TABLE比DELETE速度快且使用系统和事务日志资源少：
  - DELETE语句每次删除一行，并在事务日志中为所删除每行记录一项。
  
  - TRUNCATE TABLE通过释放存储表数据所用数据页来删除数据，并且只在事务日志中记录页的释放。
   
- TRUNCATE、DELETE和DROP三者的差异如下：
  - TRUNCATE TABLE：删除内容，释放空间，但不删除定义。
  
  - DELETE TABLE：删除内容，不删除定义，不释放空间。
  
  - DROP TABLE：删除内容和定义，释放空间。
   
 
#### 语法格式
- 清理表数据。
  ```
  TRUNCATE [ TABLE ] [ ONLY ] {table_name [ * ]} [, ... ]
      [ CONTINUE IDENTITY ] [ CASCADE | RESTRICT] [ PURGE ];
  ```
  ![](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/figure/zh-cn_image_0000002526899714.png "点击放大")
  

- 清理表分区的数据。
  ```
  ALTER TABLE [ IF EXISTS  ] { [ ONLY  ] table_name  
                             | table_name *  
                             | ONLY ( table_name )  } 
      TRUNCATE PARTITION { partition_name  
                         | FOR (  partition_value  [, ...] )  } [ UPDATE GLOBAL INDEX ];
  ```
  ![](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/figure/zh-cn_image_0000002558059555.png "点击放大")
  
 
#### 参数说明
- **ONLY**
  如果声明ONLY，只有指定的表会被清空。如果没有声明ONLY，这个表以及其所有子表（若有）会被清空。
  
- **table_name**
  目标表的名称（可以有模式修饰）。
  取值范围：已存在的表名。
  
- **CONTINUE IDENTITY**
  不改变序列的值。这是缺省值。
  
- **CASCADE \| RESTRICT**
  - CASCADE：级联清空所有由于CASCADE而被添加到组中的表。
  
  - RESTRICT（缺省值）：如果其他表在该表上有外键引用则拒绝清空。
   
- **PURGE**
  默认将表数据放入回收站中，PURGE直接清理。
  
- **partition_name**
  目标分区表的分区名。
  取值范围：已存在的分区名。
  
- **partition_value**
  指定的分区键值。
  通过PARTITION FOR子句指定的这一组值，可以唯一确定一个分区。
  取值范围：需要进行删除数据分区的分区键的取值范围。
  ![](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/public_sys-resources/notice_3.0-zh-cn.png)
  使用PARTITION FOR子句时，partition_value所在的整个分区会被清空。
  
 
- **UPDATE GLOBAL INDEX**
  如果使用该参数，则会更新分区表上的所有全局索引，以确保使用全局索引可以查询出正确的数据；如果不使用该参数，则分区表上的所有全局索引将会失效。
  
#### 示例
- 清理表数据
  ```
  --创建表reason。
  gaussdb=# CREATE TABLE reason (r_reason_sk int,r_reason_id varchar(16),r_reason_desc varchar(100));
  --向表中插入多条记录。
  gaussdb=# INSERT INTO reason values(1,'AAAAAAAABAAAAAAA','reason 1'),  (5,'AAAAAAAABAAAAAAA','reason 2'), 
                                     (15,'AAAAAAAABAAAAAAA','reason 3'), (25,'AAAAAAAABAAAAAAA','reason 4'),
                                     (35,'AAAAAAAABAAAAAAA','reason 5'), (45,'AAAAAAAACAAAAAAA','reason 6');
  --查看表的信息，大小约为8kB
  gaussdb=# \d+
                                                         List of relations
   Schema |  Name  | Type  | Owner |    Size    |                             Storage                              | Description 
  --------+--------+-------+-------+------------+------------------------------------------------------------------+-------------
   public | reason | table | omm1  | 8192 bytes | {orientation=row,compression=no,storage_type=USTORE,segment=off} | 
  (1 row)
  --使用DELETE语句不带WHERE条件，清空表的数据，并查看表的大小。
  gaussdb=# DELETE FROM reason;
  gaussdb=# \d+
                                                         List of relations
   Schema |  Name  | Type  | Owner |    Size    |                             Storage                              | Description 
  --------+--------+-------+-------+------------+------------------------------------------------------------------+-------------
   public | reason | table | omm1  | 8192 bytes | {orientation=row,compression=no,storage_type=USTORE,segment=off} | 
  (1 row)
  --使用TRUNCATE清空表reason，并查看表的大小
  gaussdb=# TRUNCATE TABLE reason;
  gaussdb=# \d+
                                                       List of relations
   Schema |  Name  | Type  | Owner |  Size   |                             Storage                              | Description 
  --------+--------+-------+-------+---------+------------------------------------------------------------------+-------------
   public | reason | table | omm1  | 0 bytes | {orientation=row,compression=no,storage_type=USTORE,segment=off} | 
  (1 row)
  --删除表。
  gaussdb=# DROP TABLE reason;
  ```
  
- 清理分区表数据。
  ```
  --创建分区表。
  gaussdb=# CREATE TABLE reason_p(
      r_reason_sk integer,
      r_reason_id character(16),
      r_reason_desc character(100)
  )PARTITION BY RANGE (r_reason_sk)(
      partition p_05_before values less than (05),
      partition p_15 values less than (15),
      partition p_25 values less than (25),
      partition p_35 values less than (35),
      partition p_45_after values less than (MAXVALUE)
  );
  --插入数据。
  gaussdb=# INSERT INTO reason_p values(1,'AAAAAAAABAAAAAAA','reason 1'),  (5,'AAAAAAAABAAAAAAA','reason 2'), 
                                       (15,'AAAAAAAABAAAAAAA','reason 3'), (25,'AAAAAAAABAAAAAAA','reason 4'),
                                       (35,'AAAAAAAABAAAAAAA','reason 5'), (45,'AAAAAAAACAAAAAAA','reason 6');
  --清空分区p_05_before。
  gaussdb=# ALTER TABLE reason_p TRUNCATE PARTITION p_05_before UPDATE GLOBAL INDEX;
  --清空分区表。
  gaussdb=# TRUNCATE TABLE reason_p;
  --删除表reason_p。
  gaussdb=# DROP TABLE reason_p;
  ```
  
 
