DROP TABLE

从当前或指定的架构中移除表,但保留该表的某个版本,以便可以使用 UNDROP TABLE 将表恢复。有关信息,请参阅 使用说明

另请参阅:

CREATE TABLEALTER TABLESHOW TABLESTRUNCATE TABLEDESCRIBE TABLE

语法

DROP TABLE [ IF EXISTS ] <name> [ CASCADE | RESTRICT ]
Copy

参数

name

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

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

CASCADE | RESTRICT

指定如果存在引用该表的外键,是否可以删除该表:

  • CASCADE:即使表具有被其他表中的外键引用的主键或唯一键,也会删除该表。

  • RESTRICT:返回有关现有外键引用的警告,并且不会删除该表。

默认:CASCADE 用于标准表;RESTRICT 用于混合表。另请参阅 删除混合表

访问控制要求

用于执行此操作的 角色 必须至少具有以下 权限

权限

对象

备注

OWNERSHIP

OWNERSHIP is a special privilege on an object that is automatically granted to the role that created the object, but can also be transferred using the GRANT OWNERSHIP command to a different role by the owning role (or any role with the MANAGE GRANTS privilege).

有关创建具有指定权限集的自定义角色的说明,请参阅 创建自定义角色

有关对 安全对象 执行 SQL 操作的相应角色和权限授予的一般信息,请参阅 访问控制概述

使用说明

  • 删除表不会将其从系统中永久移除。Time Travel 中会保留已删除表的版本,而保留天数由该表的 数据保留期 指定:

    • 在 Time Travel 保留期内,您可以使用 UNDROP TABLE 命令恢复已还原的表。

    • 在您将表删除 ,更改账户或父对象(数据库或架构)的 Time Travel 保留期不会更改删除表的 Time Travel 保留期。有关详细信息,请参阅 Time Travel 主题中的注释

    • 当 Time Travel 保留期结束时,已删除表的下一个状态取决于它是永久的、瞬态的还是临时的:

      • 永久表将进入 故障安全 状态。在故障安全状态下(为期 7 天),可以恢复已删除的表,但只能由 Snowflake 恢复。当表退出故障安全状态后,它将被清除。

      • 瞬态或临时表没有故障安全状态,因此当它移出 Time Travel 后会被清除。

        备注

        长时间运行的 Time Travel 查询将延迟将账户中的任何数据和对象(表、架构和数据库)向故障安全中的移动,直到查询完成。临时表和瞬态表的清除也将同样延迟。

      • 被删除的表一经清除便无法恢复,只能重新创建。

  • 删除表后,创建同名表将会创建该表的新版本。您仍可以通过以下步骤还原先前表的已删除版本:

    1. 重命名表的当前版本。

    2. 使用 UNDROP TABLE 命令还原表的先前版本。

  • 在删除表之前,请验证 没有视图引用该表。删除视图引用的表会使视图失效(也就是说,查询视图会返回“对象不存在”错误)。

  • 要删除表,您必须使用对表具有 OWNERSHIP 权限的角色。

  • 如果指定了 IF EXISTS 子句,而目标对象不存在,该命令会成功完成,不会返回错误。

删除混合表

当您在未指定 RESTRICT 或 CASCADE 选项的情况下删除混合表,并且该混合表与其他表具有主键/外键或唯一键/外键关系时,DROP TABLE 命令将失败,并出现错误。默认行为是 RESTRICT。

例如:

CREATE OR REPLACE HYBRID TABLE ht1(
  col1 NUMBER(38,0) NOT NULL,
  col2 NUMBER(38,0) NOT NULL,
  CONSTRAINT pkey_ht1 PRIMARY KEY (col1, col2));

CREATE OR REPLACE HYBRID TABLE ht2(
  cola NUMBER(38,0) NOT NULL,
  colb NUMBER(38,0) NOT NULL,
  colc NUMBER(38,0) NOT NULL,
  CONSTRAINT pkey_ht2 PRIMARY KEY (cola),
  CONSTRAINT fkey_ht1 FOREIGN KEY (colb, colc) REFERENCES ht1(col1,col2));

DROP TABLE ht1;
Copy
SQL compilation error:
Cannot drop the table because of dependencies

在这种情况下,DROP TABLE 命令会失败。如有必要,您可以通过在 DROP TABLE 命令中指定 CASCADE 来替换默认行为。

DROP TABLE ht1 CASCADE;
Copy

或者,在这种情况下,您可以先删除依赖表 ht2,然后再删除表 ht1

示例

删除表:

SHOW TABLES LIKE 't2%';

+---------------------------------+------+---------------+-------------+-----------+------------+------------+------+-------+--------------+----------------+
| created_on                      | name | database_name | schema_name | kind      | comment    | cluster_by | rows | bytes | owner        | retention_time |
|---------------------------------+------+---------------+-------------+-----------+------------+------------+------+-------+--------------+----------------+
| Tue, 17 Mar 2015 16:48:16 -0700 | T2   | TESTDB        | PUBLIC      | TABLE     |            |            |    5 | 4096  | PUBLIC       |              1 |
+---------------------------------+------+---------------+-------------+-----------+------------+------------+------+-------+--------------+----------------+

DROP TABLE t2;

+--------------------------+
| status                   |
|--------------------------|
| T2 successfully dropped. |
+--------------------------+

SHOW TABLES LIKE 't2%';

+------------+------+---------------+-------------+------+---------+------------+------+-------+-------+----------------+
| created_on | name | database_name | schema_name | kind | comment | cluster_by | rows | bytes | owner | retention_time |
|------------+------+---------------+-------------+------+---------+------------+------+-------+-------+----------------|
+------------+------+---------------+-------------+------+---------+------------+------+-------+-------+----------------+
Copy

再次删除该表,但如果该表不存在,则不会引发错误:

DROP TABLE IF EXISTS t2;

+------------------------------------------------------------+
| status                                                     |
|------------------------------------------------------------|
| Drop statement executed successfully (T2 already dropped). |
+------------------------------------------------------------+
Copy
语言: 中文