DROP TABLE - Amazon Redshift
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

DROP TABLE

从数据库中删除表。

如果您正在尝试清空表中的行,而不是删除表,请使用 DELETE 或 TRUNCATE 命令。

DROP TABLE 删除目标表上存在的约束。可以使用一条 DROP TABLE 命令删除多个表。

针对外部表的 DROP TABLE 不能在事务 (BEGIN … END) 内运行。有关事务的更多信息,请参阅 可序列化的隔离

要查找向组授予 DROP 特权的示例,请参阅 GRANT 示例

所需的权限

以下是 DROP TABLE 所需的权限:

  • Superuser

  • 具有 DROP TABLE 权限的用户

  • 对模式拥有 USAGE 权限的表拥有者

语法

DROP TABLE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]

参数

IF EXISTS

一个子句,指示如果指定的表不存在,则命令不应进行任何更改,并返回一条指示表不存在的消息,而不是以错误终止。

此子句在编写脚本时很有用,可使在 DROP TABLE 针对不存在的表运行时脚本不会失败。

名称

要删除的表的名称。

CASCADE

一个子句,用于指示自动删除依赖该表的对象,例如视图。

要使创建的视图不依赖于其他数据库对象(例如视图和表),请在定义视图时包括 WITH NO SCHEMA BINDING 子句。有关更多信息,请参阅CREATE VIEW

RESTRICT

一个子句,指示如果任何对象依赖该表,则不删除该表。此操作是默认操作。

示例

删除没有依赖项的表

以下示例创建一个名为 FEEDBACK 且没有依赖项的表,然后删除该表:

create table feedback(a int); drop table feedback;

如果表包含由视图或其他表引用的列,Amazon Redshift 将显示一条消息,如下所示。

Invalid operation: cannot drop table feedback because other objects depend on it

同时删除两个表

以下命令集创建一个 FEEDBACK 表和一个 BUYERS 表,然后在一条命令中同时删除这两个表:

create table feedback(a int); create table buyers(a int); drop table feedback, buyers;

删除具有依赖项的表

以下步骤说明如何使用 CASCADE 开关删除名为 FEEDBACK 的表。

首先,使用 CREATE TABLE 命令创建一个名为 FEEDBACK 的简单表:

create table feedback(a int);

下一步,使用 CREATE VIEW 命令创建一个名为 FEEDBACK_VIEW 的视图,并使该视图依赖于 FEEDBACK 表:

create view feedback_view as select * from feedback;

以下示例删除 FEEDBACK 表,同时会删除 FEEDBACK_VIEW 视图,因为 FEEDBACK_VIEW 视图依赖于 FEEDBACK 表:

drop table feedback cascade;

查看表的依赖项

要返回表的依赖关系,请使用以下示例。用您自己的架构和表替换 my_schemamy_table

SELECT dependent_ns.nspname as dependent_schema , dependent_view.relname as dependent_view , source_ns.nspname as source_schema , source_table.relname as source_table , pg_attribute.attname as column_name FROM pg_depend JOIN pg_rewrite ON pg_depend.objid = pg_rewrite.oid JOIN pg_class as dependent_view ON pg_rewrite.ev_class = dependent_view.oid JOIN pg_class as source_table ON pg_depend.refobjid = source_table.oid JOIN pg_attribute ON pg_depend.refobjid = pg_attribute.attrelid AND pg_depend.refobjsubid = pg_attribute.attnum JOIN pg_namespace dependent_ns ON dependent_ns.oid = dependent_view.relnamespace JOIN pg_namespace source_ns ON source_ns.oid = source_table.relnamespace WHERE source_ns.nspname = 'my_schema' AND source_table.relname = 'my_table' AND pg_attribute.attnum > 0 ORDER BY 1,2 LIMIT 10;

要删除 my_table 及其依赖关系,请使用以下示例。此示例还返回已删除的表的所有依赖关系。

DROP TABLE my_table CASCADE; SELECT dependent_ns.nspname as dependent_schema , dependent_view.relname as dependent_view , source_ns.nspname as source_schema , source_table.relname as source_table , pg_attribute.attname as column_name FROM pg_depend JOIN pg_rewrite ON pg_depend.objid = pg_rewrite.oid JOIN pg_class as dependent_view ON pg_rewrite.ev_class = dependent_view.oid JOIN pg_class as source_table ON pg_depend.refobjid = source_table.oid JOIN pg_attribute ON pg_depend.refobjid = pg_attribute.attrelid AND pg_depend.refobjsubid = pg_attribute.attnum JOIN pg_namespace dependent_ns ON dependent_ns.oid = dependent_view.relnamespace JOIN pg_namespace source_ns ON source_ns.oid = source_table.relnamespace WHERE source_ns.nspname = 'my_schema' AND source_table.relname = 'my_table' AND pg_attribute.attnum > 0 ORDER BY 1,2 LIMIT 10; +------------------+----------------+---------------+--------------+-------------+ | dependent_schema | dependent_view | source_schema | source_table | column_name | +------------------+----------------+---------------+--------------+-------------+

使用 IF EXISTS 删除表

以下示例删除 FEEDBACK 表(如果存在);如果不存在该表,则不执行任何操作并返回一条消息:

drop table if exists feedback;