使用 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
数据库中创建 users
和 user_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
列。
下面的语句用来要将 users
表 user_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
语句用来重命名一个已有的列。 您还可以重命名表、添加列、删除列、修改列的属性等。