更新时间:2024-11-27 GMT+08:00

TRUNCATE

功能描述

清理表数据,TRUNCATE快速地从表中删除所有行。

它和在目标表上进行无条件的DELETE有同样的效果,但由于TRUNCATE不做表扫描,因而快得多。在大表上操作效果更明显。

注意事项

请谨慎执行TRUNCATE TABLE,确认表数据可以删除后,再执行删除操作。TRUNCATE TABLE命令删除表数据后,数据将无法恢复。

  • 避免在业务高峰期执行ALTER TABLE/ALTER TABLE PARTITION(增删改查、DROP PARTITION)、TRUNCATE操作,避免有长SQL阻塞AlTER、TRUNCATE操作或SQL业务被ALTER、TRUNCATE阻塞。
  • 更多开发设计规范参见总体开发设计规范

TRUNCATE TABLE说明

  • TRUNCATE TABLE在功能上与不带WHERE子句DELETE语句相同:二者均删除表中的全部行。
  • TRUNCATE TABLE比DELETE速度快且使用系统和事务日志资源少:
    • DELETE语句每次删除一行,并在事务日志中为所删除每行记录一项。
    • TRUNCATE TABLE通过释放存储表数据所用数据页来删除数据,并且只在事务日志中记录页的释放。
  • TRUNCATE,DELETE,DROP三者的差异如下:
    • TRUNCATE TABLE,删除内容,释放空间,但不删除定义。
    • DELETE TABLE,删除内容,不删除定义,不释放空间。
    • DROP TABLE,删除内容和定义,释放空间。

语法格式

  • 清理表数据。
1
2
TRUNCATE [ TABLE ] [ ONLY ] {[[database_name.]schema_name.]table_name [ * ]} [, ... ]
    [ CONTINUE IDENTITY ] [ CASCADE | RESTRICT ];
  • 清理表分区的数据。
1
2
3
4
5
ALTER TABLE [ IF EXISTS  ] { [ ONLY  ] [[database_name.]schema_name.]table_name  
                           | table_name *  
                           | ONLY ( table_name )  } 
    TRUNCATE PARTITION { partition_name  
                       | FOR (  partition_value  [, ...] )  } ;

参数说明

  • ONLY

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

  • database_name

    目标表的数据库名称。

  • schema_name

    目标表的模式名称。

  • table_name

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

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

  • CONTINUE IDENTITY

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

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

    目标分区表的分区名。

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

  • partition_value

    指定的分区键值。

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

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

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

示例

创建分区表customer_address:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
DROP TABLE IF EXISTS customer_address;
CREATE TABLE customer_address
(
    ca_address_sk       INTEGER                  NOT NULL   ,
    ca_address_id       CHARACTER(16)            NOT NULL   ,
    ca_street_number    CHARACTER(10)                       ,
    ca_street_name      CHARACTER varying(60)               ,
    ca_street_type      CHARACTER(15)                       ,
    ca_suite_number     CHARACTER(10)                    
)
DISTRIBUTE BY HASH (ca_address_sk)
PARTITION BY RANGE(ca_address_sk)
(
        PARTITION P1 VALUES LESS THAN(2450815),
        PARTITION P2 VALUES LESS THAN(2451179),
        PARTITION P3 VALUES LESS THAN(2451544),
        PARTITION P4 VALUES LESS THAN(MAXVALUE)
);

清空表customer_address分区p1:

1
ALTER TABLE customer_address TRUNCATE PARTITION p1;

清空分区表:

1
TRUNCATE TABLE customer_address;