在 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 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