更新时间:2024-08-20 GMT+08:00

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 ]};
  • 清理表分区的数据。
    ALTER TABLE [ IF EXISTS  ] { [ ONLY  ] table_name  
                               | table_name *  
                               | ONLY ( table_name )  } 
        TRUNCATE PARTITION { partition_name  
                           | FOR (  partition_value  [, ...] )  } [ UPDATE GLOBAL INDEX ];

参数说明

  • ONLY

    如果声明ONLY,只有指定的表会被清空。如果没有声明ONLY,这个表以及其所有子表(若有)会被清空。

  • table_name

    目标表的名称(可以有模式修饰)。

    取值范围:已存在的表名。

  • CONTINUE IDENTITY

    不改变序列的值。这是缺省值。

  • CASCADE | RESTRICT
    • CASCADE:级联清空所有由于CASCADE而被添加到组中的表。
    • RESTRICT(缺省值):如果其他表在该表上有外键引用则拒绝清空。
  • PURGE

    默认将表数据放入回收站中,PURGE直接清理。

  • partition_name

    目标分区表的分区名。

    取值范围:已存在的分区名。

  • partition_value

    指定的分区键值。

    通过PARTITION FOR子句指定的这一组值,可以唯一确定一个分区。

    取值范围:需要进行删除数据分区的分区键的取值范围。

    使用PARTITION FOR子句时,partition_value所在的整个分区会被清空。

  • UPDATE GLOBAL INDEX

    如果使用该参数,则会更新分区表上的所有全局索引,以确保使用全局索引可以查询出正确的数据;如果不使用该参数,则分区表上的所有全局索引将会失效。

示例

  • 清理表数据
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    --创建表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;
    
  • 清理分区表数据。
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    --创建分区表。
    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;
    
    --清空分区p_15。
    gaussdb=# ALTER TABLE reason_p TRUNCATE PARTITION for (13) UPDATE GLOBAL INDEX;
    
    --清空分区表。
    gaussdb=# TRUNCATE TABLE reason_p;
    
    --删除表reason_p。
    gaussdb=# DROP TABLE reason_p;