在 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);
Author: Shihab Sikder