在 Postgres 中更改列类型

Shihab Sikder 2022年5月14日
在 Postgres 中更改列类型

本文展示了如何在 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
Shihab Sikder avatar Shihab Sikder avatar

I'm Shihab Sikder, a professional Backend Developer with experience in problem-solving and content writing. Building secure, scalable, and reliable backend architecture is my motive. I'm working with two companies as a part-time backend engineer.

LinkedIn Website