使用 PostgreSQL RENAME COLUMN 重命名一个列

在本文中,您将了解如何使用 PostgreSQL ALTER TABLE ... RENAME COLUMN 语句重命名一个或者多个列。

PostgreSQL 允许您使用 ALTER TABLE RENAME COLUMN 语句来重命名一个已有的列。

PostgreSQL RENAME COLUMN 语法

要重命名一个表中的一个列,请按照如下语法使用 ALTER TABLE ... RENAME COLUMN 语句:

ALTER TABLE table_name
RENAME [COLUMN] column_name to new_column_name;

解释说明:

  • table_name 是要在其中重命名列的表。
  • RENAME [COLUMN] ... TO ... 子句用重命名一个列。其中 COLUMN 关键字是可以省略的。
  • column_name 是要重命名的列的名字。 new_column_name 是列的新名字。

当您要重命名一个列时,如果有其他的数据库对象(比如外键视图触发器存储过程等)引用了此列, PostgreSQL 将自动更改那些依赖对象中的列名。

如果您输入一个不存在列名, PostgreSQL 将给出一个错误: ERROR: column “x” does not exist。

一个 ALTER TABLE ... RENAME COLUMN 语句只能重命名一个列。如果您想重命名多个列,请使用多个语句。

PostgreSQL RENAME COLUMN 示例

这个实例演示了如何在 PostgreSQL 中重命名一个表中的一个列。

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

使用以下语句创建 users 表:

DROP TABLE IF EXISTS 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 表:

DROP TABLE IF EXISTS 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);

使用 \d 命令查看 users 表的定义:

\d users
                           Table "public.users"
   Column   |            Type             | Collation | Nullable | Default
------------+-----------------------------+-----------+----------+---------
 user_id    | integer                     |           | not null |
 name       | character varying(45)       |           | not null |
 age        | integer                     |           |          |
 locked     | boolean                     |           | not null | false
 created_at | timestamp without time zone |           | not null |
Indexes:
    "users_pkey" PRIMARY KEY, btree (user_id)
Referenced by:
    TABLE "user_hobbies" CONSTRAINT "fk_user" FOREIGN KEY (user_id) REFERENCES users(user_id) ON UPDATE RESTRICT ON DELETE CASCADE

使用 \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 users(user_id) ON UPDATE RESTRICT ON DELETE CASCADE

我们看到, user_hobbies 表中的外键 fk_user 引用了 users 表中的 user_id 列。

下面的语句用来要将 usersuser_id 列重命名为 id

ALTER TABLE users
RENAME COLUMN user_id TO id;

由于 user_hobbies 表中的外键 fk_user 引用了 users 表中的 user_id 列,因此 PostgreSQL 自动更新了这个外键依赖的列名。

我们可以通过 \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 users(id) ON UPDATE RESTRICT ON DELETE CASCADE

从最后一行的 users(id),我们看到了外键中依赖的列名被自动更新了。

总结

PostgreSQL ALTER TABLE RENAME COLUMN 语句用来重命名一个已有的列。 您还可以重命名表添加列删除列、修改列的属性等。