如何在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.