PostgreSQL DROP TABLE 删除表

本文介绍了如何在 PostgreSQL 中使用 DROP TABLE 语句删除一个或者多个表。

当我们不需要某个表的时候,我们可以将此表删除。PostgreSQL 允许我们使用 DROP TABLE 语句删除一个或者多个表。

注意:DROP TABLE 语句将永久删除表和表中的数据,请谨慎操作。

删除表注意事项

删除表是一个很危险的操作。一个被删除后,您很难再恢复其中的数据。

删除列表之前一定要确定此操作的必要性。

如果您决定了要删除一个表,删除之前请一定要备份表和表中的数据

PostgreSQL DROP TABLE 语法

要从数据库中删除表,您应该是超级用户或者表的所有者。请按照如下语法使用 DROP TABLE 语句:

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

解释说明:

  • table_name 是要删除的表的名称。

  • 您可以在一个 DROP TABLE 语句中删除多个表,请使用逗号分隔表名。

  • IF EXISTS 选项是可选的,它可以避免由于输入的表名 table_name 不存在引发的错误。

  • CASCADE | RESTRICT 是可选的,它指示了如果有其他对象(比如外键视图触发器存储过程等)引用了要删除的表的处理策略。其中:

    • CASCADE - 允许删除指定的表和引用此表的对象。
    • RESTRICT - 如果有对象引用此表,拒绝删除此表,并给出错误。它是默认的选项。

PostgreSQL DROP TABLE 示例

这个实例演示了如何在 PostgreSQL 中删除一个表。

我们将在 testdb 数据库中创建 usersuser_hobbies 两个表。其中, users 表用来存储用户的名称,性别,年龄等信息。 user_hobbies 表用来存储用户的业余爱好。

使用以下语句创建 users 表:

CREATE TABLE users (
  user_id INTEGER NOT NULL PRIMARY KEY,
  name VARCHAR(45) NOT NULL,
  age INTEGER,
  locked BOOLEAN NOT NULL DEFAULT false,
  created_at TIMESTAMP NOT NULL
);

使用以下语句创建 user_hobbies 表:

CREATE TABLE user_hobbies (
  hobby_id SERIAL NOT NULL,
  user_id INTEGER NOT NULL,
  hobby VARCHAR(45) NOT NULL,
  created_at TIMESTAMP NOT NULL,
  PRIMARY KEY (hobby_id),
  CONSTRAINT fk_user
    FOREIGN KEY (user_id)
    REFERENCES users (user_id)
    ON DELETE CASCADE
    ON UPDATE RESTRICT);

使用以下语句删除 users

DROP TABLE users;
ERROR:  cannot drop table users because other objects depend on it
DETAIL:  constraint fk_user on table user_hobbies depends on table users
HINT:  Use DROP ... CASCADE to drop the dependent objects too.

这里,删除 users 表失败了, PostgreSQL 给出一个错误提示。 因为 user_hobbies 表的外键引用了 users 表,如果删除了 users 表, user_hobbies 表中的数据将是无意义的。

如果要强制删除此表,请使用 CASCADE 选项,如下:

DROP TABLE users CASCADE;
NOTICE:  drop cascades to constraint fk_user on table user_hobbies
DROP TABLE

这里, users 表被删除了,并且 user_hobbies 表上的外键约束 fk_user 也被级联删除了。

我们可以通过 \d 命令查看表定义以验证是否外键是否被删除,如下:

\d user_hobbies
                                           Table "public.user_hobbies"
   Column   |            Type             | Collation | Nullable |                    Default
------------+-----------------------------+-----------+----------+------------------------------------------------
 hobby_id   | integer                     |           | not null | nextval('user_hobbies_hobby_id_seq'::regclass)
 user_id    | integer                     |           | not null |
 hobby      | character varying(45)       |           | not null |
 created_at | timestamp without time zone |           | not null |
Indexes:
    "user_hobbies_pkey" PRIMARY KEY, btree (hobby_id)

删除一个不存在的表

如果在 DROP TABLE 输入了一个不存在的表名, PostgreSQL 将会给出一个错误,如下:

DROP TABLE x;
ERROR:  table "x" does not exist

您可以使用 IF EXISTS 选项以避免这个错误,如下:

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

这里, 该语句执行通过,PostgreSQL 给出了一个通知而不是错误。

结论

在 PostgreSQL 中,DROP TABLE 语句用于删除一个或者多个表。

  • DROP TABLE 关键字后面是要删除的表名。如果要删除多个表,请使用逗号分隔表名。
  • IF EXISTS 选项避免了删除不存在的表时发生的错误。它是可选的。
  • CASCADE 选项可以强制删除被引用的表。

始终需要注意的是:DROP TABLE 语句会物理删除表和表中的数据。这个操作不能撤销,请谨慎操作。在操作之前请务必备份要删除的表,或者备份整个数据库。