九月 10, 2023
摘要:本教程逐步向您展示如何使用ALTER TABLE
语句更改列的数据类型。
目录
PostgreSQL 更改列类型语句
要更改列的数据类型,请使用 ALTER TABLE 语句,如下:
ALTER TABLE table_name
ALTER COLUMN column_name [SET DATA] TYPE new_data_type;
让我们更详细地检查该语句:
- 首先,在
ALTER TABLE
关键字后指定要更改的列的表的名称。 - 其次,在
ALTER COLUMN
子句后指定要更改数据类型的列的名称。 - 第三,在
TYPE
关键字之后为列提供新的数据类型。SET DATA TYPE
和TYPE
是等价的。
要在单个语句中更改多个列的数据类型,可以使用多个ALTER COLUMN
子句,如下所示:
ALTER TABLE table_name
ALTER COLUMN column_name1 [SET DATA] TYPE new_data_type,
ALTER COLUMN column_name2 [SET DATA] TYPE new_data_type,
...;
在此语法中,您在每个ALTER COLUMN
子句后添加一个逗号 (,
) 。
PostgreSQL 允许您通过添加USING
子句将列的值转换为新值,同时更改其数据类型,如下所示:
ALTER TABLE table_name
ALTER COLUMN column_name TYPE new_data_type USING expression;
USING
子句指定一个表达式,允许您将旧值转换为新值。
如果省略USING
子句,PostgreSQL 将隐式将值转换为新值。如果转换失败,PostgreSQL 将发出错误,并建议您提供带表达式的USING
子句用于数据转换。
USING
关键字后面的表达式可以像column_name::new_data_type
一样简单,如price::numeric
,也可以像自定义函数一样复杂。
PostgreSQL 更改列类型示例
让我们创建一个新表,名为assets
,并向该表中插入一些行以进行演示。
CREATE TABLE assets (
id serial PRIMARY KEY,
name TEXT NOT NULL,
asset_no VARCHAR NOT NULL,
description TEXT,
location TEXT,
acquired_date DATE NOT NULL
);
INSERT INTO assets(name,asset_no,location,acquired_date)
VALUES('Server','10001','Server room','2017-01-01'),
('UPS','10002','Server room','2017-01-01');
要将name
列的数据类型更改为 VARCHAR,请使用以下语句:
ALTER TABLE assets
ALTER COLUMN name TYPE VARCHAR;
以下语句将description
和location
列的数据类型从 TEXT 更改为VARCHAR
:
ALTER TABLE assets
ALTER COLUMN location TYPE VARCHAR,
ALTER COLUMN description TYPE VARCHAR;
要将asset_no
列的数据类型更改为整型,请使用以下语句:
ALTER TABLE assets
ALTER COLUMN asset_no TYPE INT;
PostgreSQL 发出了一个错误和一个非常有用的提示:
ERROR: column "asset_no" cannot be cast automatically to type integer
HINT: You might need to specify "USING asset_no::integer".
以下语句将USING
子句添加到上述语句中:
ALTER TABLE assets
ALTER COLUMN asset_no TYPE INT
USING asset_no::integer;
它按预期工作。
在本教程中,您学习了如何使用ALTER TABLE ALTER COLUMN
语句来更改列的类型。