PostgreSQL 重命名表

本文介绍了如何在 PostgreSQL 中使用 ALTER TABLE 语句重命名一个表。

有时候,您会由于一些原因修改一个现有的表的名称。比如:

  • 您在创建表的时候使用了错误的表名。
  • 您需要将表名更改为一个更有意义的名称。
  • 产品的需求发生变化,需要将表名更改以适应新的业务。
  • 您所在的团队使用了新的命名规则,您需要重命名那些不符合新规则的表。

在 PostgreSQL 中,您可以使用 ALTER TABLE 语句重命名一个表。

PostgreSQL 重命名表语法

要重命名一个表,请按照如下语法使用 ALTER TABLE 语句:

ALTER TABLE [IF EXISTS] table_name
RENAME TO new_table_name;

解释说明:

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

当您重名一个表时,PostgreSQL 会自动更新那些依赖此表的对象。

PostgreSQL 重命名表示例

这个实例演示了如何在 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);

要查看 user_hobbies 表的定义,请使用 \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)
Foreign-key constraints:
    "fk_user" FOREIGN KEY (user_id) REFERENCES users(user_id) ON UPDATE RESTRICT ON DELETE CASCADE

这里, user_hobbies 表具有一个引用 users 表的外键。

假设,您所在的团队制定了新的命名规则,所有的表都需要一个 t_ 开头,因此您需要将 users 表重命名为 t_users,将 user_hobbies 表重命名为 t_user_hobbies

要将 users 表重命名为 t_users,请使用下面的语句:

ALTER TABLE users RENAME TO t_users;

再次使用 \d 命令查看 user_hobbies 表的定义:

\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)
Foreign-key constraints:
    "fk_user" FOREIGN KEY (user_id) REFERENCES t_users(user_id) ON UPDATE RESTRICT ON DELETE CASCADE

从输出中可以清楚地看到,外键约束已更新并改为引用 t_users 表。

要将 user_hobbies 表重命名为 t_user_hobbies,请使用下面的语句:

ALTER TABLE user_hobbies RENAME TO t_user_hobbies;

最后,使用 \dt 命令查看一下当前数据库中的所有的表以验证结果:

\dt
             List of relations
 Schema |      Name      | Type  |  Owner
--------+----------------+-------+----------
 public | t_user_hobbies | table | postgres
 public | t_users        | table | postgres
(2 rows)

结论

在 PostgreSQL 中,您可以使用 ALTER TABLE ... RENAME TO 语句重命名一个表。