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