在 Postgres 中更改列类型
Shihab Sikder
2022年5月14日
本文展示了如何在 Postgres 中将列类型更改为另一种数据类型。
使用 ALTER TABLE
命令更改 Postgres 中的列类型
ALTER TABLE <table_name>
ALTER COLUMN <column_name> [SET DATA] TYPE <new_type>;
使用表名
、列名
和新类型
。例如:
CREATE TABLE student(
id SERIAL PRIMARY KEY,
name VARCHAR NOT NULL,
admission_date DATE NOT NULL,
contact_no INT NOT NULL,
description TEXT
);
输出:
postgres=# \d student
Table "public.student"
Column | Type | Collation | Nullable | Default
----------------+-------------------+-----------+----------+-------------------------------------
id | integer | | not null | nextval('student_id_seq'::regclass)
name | character varying | | not null |
admission_date | date | | not null |
contact_no | integer | | not null |
description | text | | |
Indexes:
"student_pkey" PRIMARY KEY, btree (id)
postgres=#
要更改学生联系电话的数据类型并将其更改为 VARCHAR
,联系电话之间可以有+
或 -
。
所以改变上列数据类型的命令:
ALTER TABLE student
ALTER COLUMN contact_no TYPE VARCHAR;
表说明:
postgres=# ALTER TABLE student
postgres-# ALTER COLUMN contact_no TYPE VARCHAR;
ALTER TABLE
postgres=# \d student;
Table "public.student"
Column | Type | Collation | Nullable | Default
----------------+-------------------+-----------+----------+-------------------------------------
id | integer | | not null | nextval('student_id_seq'::regclass)
name | character varying | | not null |
admission_date | date | | not null |
contact_no | character varying | | not null |
description | text | | |
Indexes:
"student_pkey" PRIMARY KEY, btree (id)
postgres=#
如果表中填充了一些行,并且在 contact_no
列中,你有 VARCHAR
或非数字值。
如果你再次尝试将 contact_no
的数据类型更改为 int
,那么 Postgres 将显示一个名为 You may need to specify USING <column_name>::<data_type>
的错误。
使用以下 SQL 命令插入一行:
INSERT INTO STUDENT(name,admission_date,contact_no,description)
VALUES('John Doe','2022-01-01','1212125856 ','Lorem ipsum');
运行更改数据类型的语句:
postgres=# ALTER TABLE student
postgres-# ALTER COLUMN contact_no TYPE INT;
ERROR: column "contact_no" cannot be cast automatically to type integer
HINT: You might need to specify "USING contact_no::integer".
postgres=#
因此,你也需要添加这一行。
ALTER TABLE student
ALTER COLUMN contact_no TYPE VARCHAR
USING contact_no::integer;
现在,上面的 SQL 命令将被接受。但是,VARCHAR
可能包含前导或尾部的空白,因此你需要去除空格。
更新后的命令将如下所示:
ALTER TABLE student
ALTER COLUMN contact_no TYPE VARCHAR
USING (trim(contact_no)::integer);
作者: Shihab Sikder