如何在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;
現在可以工作了。
廣告
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP