如何在PostgreSQL中更改列的型別?


為了更改列的型別,語法如下:

ALTER TABLE table_name
ALTER COLUMN column_name TYPE new_data_type USING expression;

請注意,通常不建議更改列的型別,尤其是在您的表中已經有很多條目時。

語法的USING部分是可選的。當您需要使用表示式將該列中現有條目從當前型別轉換為新型別時,可以使用它。例如,如果您將型別為INTEGER的列轉換為型別BIGINTEGER,則無需使用任何表示式來將現有條目轉換為新型別。

但是,如果您將TEXT或VARCHAR條目轉換為INTEGER,則預設情況下將無法執行此操作,除非您提供一個表示式來將現有的TEXT/VARCHAR值轉換為整數。

讓我們使用一個示例來理解這兩種情況。讓我們建立一個新的表marks -

CREATE TABLE marks(
   serial_no INTEGER PRIMARY KEY,
   name VARCHAR,
   roll_no INTEGER,
   marks_obtained INTEGER,
   perc_marks DOUBLE PRECISION,
   max_marks INTEGER,
   date_of_entry DATE
);

現在,讓我們填充它

INSERT INTO marks(serial_no,name, roll_no, marks_obtained,
perc_marks, max_marks, date_of_entry)
VALUES (1,'Yash', 26, 42, 42.0, 100, current_date),
(2,'Isha', 56, 175, 87.5, 200, current_date);

現在,假設我們要將serial_no列的型別從INTEGER更改為BIGINTEGER。我們無需使用任何表示式來轉換列型別。

ALTER TABLE marks
ALTER COLUMN serial_no TYPE BIGINT;

現在,為了理解需要使用表示式的案例,讓我們首先將roll_no列轉換為VARCHAR型別。

ALTER TABLE marks
ALTER COLUMN roll_no TYPE VARCHAR;

此語句將執行。因為整數到文字的轉換不會使PostgreSQL混淆。它只是用表示該數字的字元替換數字。26 變為“26”。現在,讓我們嘗試將roll_no列轉換回整數

ALTER TABLE marks
ALTER COLUMN roll_no TYPE INTEGER;

PostgreSQL現在將丟擲一個錯誤。這是因為文字到整數的轉換對於PostgreSQL來說並不那麼簡單。具體來說,錯誤將顯示為 -

ERROR: column "roll_no" cannot be cast automatically to type integer HINT: You might need to specify "USING roll_no::integer". SQL state: 42804

這很棒。PostgreSQL甚至為我們提供了一個提示。它要求我們顯式地將roll_no值轉換為整數型別。::表示PostgreSQL中的CAST運算子。

讓我們接受PostgreSQL的提示並執行 -

ALTER TABLE marks
ALTER COLUMN roll_no TYPE INTEGER USING roll_no::integer;

現在可以工作了。

更新於:2021年2月2日

5K+ 瀏覽量

開啟您的職業生涯

透過完成課程獲得認證

立即開始
廣告

© . All rights reserved.