PostgreSQL 教程: 更改列类型

九月 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 TYPETYPE是等价的。

要在单个语句中更改多个列的数据类型,可以使用多个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');

img

要将name列的数据类型更改为 VARCHAR,请使用以下语句:

ALTER TABLE assets 
ALTER COLUMN name TYPE VARCHAR;

以下语句将descriptionlocation列的数据类型从 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语句来更改列的类型。