本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
DROP TABLE
从数据库中删除表。只有表的所有者、schema 所有者或超级用户才能删除表。
如果您正在尝试清空表中的行,而不是删除表,请使用 DELETE 或 TRUNCATE 命令。
DROP TABLE 删除目标表上存在的约束。可以使用一条 DROP TABLE 命令删除多个表。
针对外部表的 DROP TABLE 不能在事务 (BEGIN … END) 内运行。有关事务的更多信息,请参阅 可序列化的隔离。
Syntax
DROP TABLE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]
Parameters
- IF EXISTS
-
一个子句,指示如果指定的表不存在,则命令不应进行任何更改,并返回一条指示表不存在的消息,而不是以错误终止。
此子句在编写脚本时很有用,可使在 DROP TABLE 针对不存在的表运行时脚本不会失败。
- name
-
要删除的表的名称。
- CASCADE
-
一个子句,用于指示自动删除依赖该视图的对象,例如其他视图。
要使创建的视图不依赖于其他数据库对象(例如视图和表),请在定义视图时包括 WITH NO SCHEMA BINDING 子句。有关更多信息,请参阅CREATE VIEW。
- RESTRICT
-
一个子句,指示如果任何对象依赖该表,则不删除该表。此操作是默认操作。
Examples
删除没有依赖项的表
以下示例创建一个名为 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;
查看表的依赖项
您可以创建一个视图,其中保存数据库中所有表的依赖关系信息。在删除指定的表之前,请先查询此视图,了解该表是否具有依赖项。
键入以下命令来创建 FIND_DEPEND 视图,该视图联接依赖项与对象引用:
create view find_depend as select distinct c_p.oid as tbloid, n_p.nspname as schemaname, c_p.relname as name, n_c.nspname as refbyschemaname, c_c.relname as refbyname, c_c.oid as viewoid from pg_catalog.pg_class c_p join pg_catalog.pg_depend d_p on c_p.relfilenode = d_p.refobjid join pg_catalog.pg_depend d_c on d_p.objid = d_c.objid join pg_catalog.pg_class c_c on d_c.refobjid = c_c.relfilenode left outer join pg_namespace n_p on c_p.relnamespace = n_p.oid left outer join pg_namespace n_c on c_c.relnamespace = n_c.oid where d_c.deptype = 'i'::"char" and c_c.relkind = 'v'::"char";
现在从 SALES 表创建 SALES_VIEW:
create view sales_view as select * from sales;
现在,查询 FIND_DEPEND 视图以查看数据库中的依赖项。将查询范围限制为 PUBLIC schema,如以下代码所示:
select * from find_depend where refbyschemaname='public' order by name;
此查询返回以下依赖项,表明如果在删除 SALES 表时使用 CASCADE 选项,还将删除 SALES_VIEW 视图:
tbloid | schemaname | name | viewoid | refbyschemaname | refbyname --------+------------+-------------+---------+-----------------+------------- 100241 | public | find_depend | 100241 | public | find_depend 100203 | public | sales | 100245 | public | sales_view 100245 | public | sales_view | 100245 | public | sales_view (3 rows)
使用 IF EXISTS 删除表
以下示例删除 FEEDBACK 表(如果存在);如果不存在该表,则不执行任何操作并返回一条消息:
drop table if exists feedback;