TRUNCATE TABLE

从表中移除所有行,但保持表不变(包括表的所有权限和约束条件)。同时删除表的加载元数据,以便在命令完成后可以再次将相同的文件加载到表中。

请注意,这与 DROP TABLE 不同,后者从系统中移除表,但保留表的一个版本(及其加载历史记录),以便可以恢复。

另请参阅:

CREATE TABLE

语法

TRUNCATE [ TABLE ] [ IF EXISTS ] <name>

TRUNCATE [ TABLE ] [ IF EXISTS ] ERROR_TABLE( <base_table_name> )

参数

name

指定要截断的表的标识符。如果标识符包含空格或特殊字符,则整个字符串必须放在双引号内。放在双引号内的标识符也区分大小写(例如,"My Object")。

如果表标识符不是完全限定的(以 db_name.schema_name.table_nameschema_name.table_name 的形式),则该命令将在会话的当前架构中查找表。

ERROR_TABLE( base_table_name )

截断与指定基表关联的错误表。有关错误表的更多信息,请参阅 DML 错误日志记录

如果标识符包含空格或特殊字符,则整个字符串必须放在双引号内。放在双引号内的标识符也区分大小写(例如,"My Object")。

如果表标识符不是完全限定的(以 db_name.schema_name.table_nameschema_name.table_name 的形式),则该命令将在会话的当前架构中查找表。

使用说明

  • DELETE 和 TRUNCATE TABLE 都会在数据保留期内维护已删除的数据以用于恢复目的(即,使用 Time Travel)。但是,当表被截断时,加载元数据将无法恢复。

  • 如果表名是完全限定的,或者会话当前正在使用数据库和架构,则 TABLE 关键字是可选的。

示例

以下示例截断了表:

  1. 创建基本表并插入数据:

    CREATE OR REPLACE TABLE temp_test_truncate (i number);
    
    INSERT INTO temp_test_truncate SELECT seq8() FROM table(generator(rowcount=>20)) v;
    
    SELECT COUNT (*) FROM temp_test_truncate;
    
    +-----------+
    | COUNT (*) |
    |-----------|
    |        20 |
    +-----------+
    
  2. 截断表:

    TRUNCATE TABLE IF EXISTS temp_test_truncate;
    
  3. 验证表现在是否为空:

    SELECT COUNT (*) FROM temp_test_truncate;
    
    +-----------+
    | COUNT (*) |
    |-----------|
    |         0 |
    +-----------+