九月 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) 删除具有依赖对象的表
以下语句创建了两个新表,名为authors
和pages
:
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
语句删除tvshows
和animes
表:
DROP TABLE tvshows, animes;
概括
-
使用
DROP TABLE
语句删除表。 -
使用
CASCADE
选项删除表及其所有依赖对象。