PostgreSQL 教程: DROP TABLE 删除表

九月 13, 2023

摘要:在本教程中,您将学习如何使用 PostgreSQL 的DROP TABLE语句从数据库中删除现有表。

PostgreSQL DROP TABLE 语句简介

要从数据库中删除表,请使用DROP TABLE语句,如下:

DROP TABLE [IF EXISTS] table_name 
[CASCADE | RESTRICT];

在这个语法中:

  • 首先,在DROP TABLE关键字后指定要删除的表的名称。
  • 其次,使用IF EXISTS选项时,仅当表存在才删除该表。

如果删除不存在的表,PostgreSQL 会发出错误。为了避免这种情况,您可以使用IF EXISTS选项。

如果要删除的表已在其他对象(例如视图触发器、函数和存储过程)中使用,则DROP TABLE无法删除该表。在这种情况下,您有两种选择:

  • CASCADE选项允许您删除表及其依赖对象。
  • 如果有任何对象依赖于表,RESTRICT选项将拒绝删除。如果您未在DROP TABLE语句中明确指定,则RESTRICT选项为默认行为。

要一次删除多个表,您可以在DROP TABLE关键字后面放置一个以逗号分隔的表列表:

DROP TABLE [IF EXISTS] 
   table_name_1,
   table_name_2,
   ...
[CASCADE | RESTRICT];

请注意,您需要具有超级用户、模式所有者或表所有者的角色,才能删除表。

PostgreSQL DROP TABLE 示例

让我们看一些使用 PostgreSQL 的 DROP TABLE 语句的示例。

1) 删除不存在的表

以下语句删除数据库中名为author的表:

DROP TABLE author;

PostgreSQL 发出错误,因为author表不存在。

ERROR:  table "author" does not exist

为了避免该错误,您可以使用IF EXISTS这样的选项。

DROP TABLE IF EXISTS author;
NOTICE:  table "author" does not exist, skipping DROP TABLE

从输出中可以清楚看到,PostgreSQL 发出了通知而不是错误。

2) 删除具有依赖对象的表

以下语句创建了两个新表,名为authorspages

CREATE TABLE authors (
	author_id INT PRIMARY KEY,
	firstname VARCHAR (50),
	lastname VARCHAR (50)
);

CREATE TABLE pages (
	page_id serial PRIMARY KEY,
	title VARCHAR (255) NOT NULL,
	contents TEXT,
	author_id INT NOT NULL,
	FOREIGN KEY (author_id) 
          REFERENCES authors (author_id)
);

以下语句使用DROP TABLE来删除author表:

DROP TABLE IF EXISTS authors;

因为page表上的约束依赖于author表,所以 PostgreSQL 会发出错误消息:

ERROR:  cannot drop table authors because other objects depend on it
DETAIL:  constraint pages_author_id_fkey on table pages depends on table authors
HINT:  Use DROP ... CASCADE to drop the dependent objects too.
SQL state: 2BP01

在这种情况下,您需要先删除所有依赖对象,然后再删除author表,或者使用CASCADE选项,如下:

DROP TABLE authors CASCADE;

PostgreSQL 删除author表以及page表中的约束。

如果DROP TABLE语句删除了正在删除的表的依赖对象,它将发出如下通知:

NOTICE:  drop cascades to constraint pages_author_id_fkey on table pages

3) 删除多个表

以下语句创建两个表用于演示目的:

CREATE TABLE tvshows(
	tvshow_id INT GENERATED ALWAYS AS IDENTITY,
	title VARCHAR,
	release_year SMALLINT,
	PRIMARY KEY(tvshow_id)
);

CREATE TABLE animes(
	anime_id INT GENERATED ALWAYS AS IDENTITY,
	title VARCHAR,
	release_year SMALLINT,
	PRIMARY KEY(anime_id)
);

以下示例使用单个DROP TABLE语句删除tvshowsanimes表:

DROP TABLE tvshows, animes;

概括

  • 使用DROP TABLE语句删除表。

  • 使用CASCADE选项删除表及其所有依赖对象。