如何在PostgreSQL表中更改列的数据类型?

273

将以下命令输入到 PostgreSQL 交互式终端中会导致错误:

ALTER TABLE tbl_name ALTER COLUMN col_name varchar (11);

如何正确地更改列的数据类型?

3个回答

409

87
针对某些情况,您可能需要指定强制转换的方式,例如 ALTER TABLE tbl_name ALTER COLUMN col_name TYPE integer USING col_name::integer; - Nobu
7
@Nobu 为什么我们在“一些情况下”需要这样做,这些情况是什么? - Darth.Vader
7
@Darth.Vader,当列中已经存在无法自动转换的数据时,您可能需要执行此操作。 - Jonathan Porter
1
另一个类型转换的例子:我有一个包含现有数据的jsonb列,我需要将其转换为文本。 - jmathew
在某些情况下,您可能需要将转换与nullif表达式结合使用,特别是如果您已经有一个在您要更改的字段/列上具有空值的记录。在我的情况下,我尝试将列类型从varchar更改为uuid,但我有一个希望更改的字段中的空值。因此,我收到了无效的输入语法错误。为了解决这种情况,我将alter语句与以下nullif表达式相结合:alter table user alter column branch_id type uuid using (nullif(branch_id,''))::uuid; - yauritux
值得一提的是,在某些情况下,您可能希望按照以下方式进行两次转换:col_name::text::real; - undefined

65
如果列中已经存在数据,你应该这样做:
ALTER TABLE tbl_name ALTER COLUMN col_name TYPE integer USING (NULLIF(col_name, '')::integer);

正如@nobu和@jonathan-porter在对@derek-kromm的回答的评论中所指出的那样,有点神秘。

如果该列是带有默认值的 NUMERIC 类型,那么如何删除或更改默认值呢? - TheRealChx101

16

很酷 @derek-kromm,你的回答被接受并且正确,但是我在想我们是否需要修改不止一列。这里是我们可以这样做的方法:

ALTER TABLE tbl_name 
ALTER COLUMN col_name TYPE varchar (11), 
ALTER COLUMN col_name2 TYPE varchar (11),
ALTER COLUMN col_name3 TYPE varchar (11);

文档

干杯!! 简单读,简单写


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接