如何更改 PostgreSQL 中列的类型?
为了改变列的类型,语法是
ALTER TABLE table_name ALTER COLUMN column_name TYPE new_data_type USING expression;
请注意,一般不建议更改列的类型,特别是如果您的表已经有很多条目。
语法的USING部分是可选的。当您需要使用表达式将该列中的现有条目从当前类型转换为新类型时使用。例如,如果将类型为INTEGER的列转换为类型BIGINTEGER,则无需使用任何表达式将现有条目转换为新类型。
但是,如果您将TEXT或VARCHAR条目转换为INTEGER,则默认情况下您将无法执行此操作,除非您提供用于将现有TEXT/VARCHAR值转换为整数的表达式。
让我们通过一个例子来理解这两种情况。让我们创建一个新的表标记-
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;
它现在会起作用。