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_schema
和 my_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;