

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# DROP TABLE
<a name="r_DROP_TABLE"></a>

从数据库中删除表。

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

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

针对外部表的 DROP TABLE 不能在事务 (BEGIN … END) 内运行。有关事务的更多信息，请参阅 [Amazon Redshift 中的隔离级别](c_serial_isolation.md)。

要查找向组授予 DROP 特权的示例，请参阅 GRANT [示例](r_GRANT-examples.md)。

## 所需的权限
<a name="r_DROP_TABLE-privileges"></a>

以下是 DROP TABLE 所需的权限：
+ Superuser
+ 具有 DROP TABLE 权限的用户
+ 对模式拥有 USAGE 权限的表拥有者

## 语法
<a name="r_DROP_TABLE-synopsis"></a>

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

## 参数
<a name="r_DROP_TABLE-parameters"></a>

IF EXISTS  
一个子句，指示如果指定的表不存在，则命令不应进行任何更改，并返回一条指示表不存在的消息，而不是以错误终止。  
此子句在编写脚本时很有用，可使在 DROP TABLE 针对不存在的表运行时脚本不会失败。

 *名称*   
要删除的表的名称。

CASCADE  
一个子句，用于指示自动删除依赖该表的对象，例如视图。  
要使创建的视图不依赖于其他数据库对象（例如视图和表），请在定义视图时包括 WITH NO SCHEMA BINDING 子句。有关更多信息，请参阅 [CREATE VIEW](r_CREATE_VIEW.md)。

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

## 示例
<a name="r_DROP_TABLE-examples"></a>

 **删除没有依赖项的表** 

以下示例创建一个名为 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\$1VIEW 的视图，并使该视图依赖于 FEEDBACK 表：

```
create view feedback_view as select * from feedback;
```

 以下示例删除 FEEDBACK 表，同时会删除 FEEDBACK\$1VIEW 视图，因为 FEEDBACK\$1VIEW 视图依赖于 FEEDBACK 表：

```
drop table feedback cascade;
```

 **查看表的依赖项** 

要返回表的依赖关系，请使用以下示例。用您自己的架构和表替换 *my\$1schema* 和 *my\$1table*。

```
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\$1table* 及其依赖关系，请使用以下示例。此示例还返回已删除的表的所有依赖关系。

```
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;
```