将 PostgreSQL 数据库中的列从整数类型转换为文本类型

26

我有一个PostgreSQL(9.0)数据库,其中有一列card_id,目前是整数类型。

我需要将其更改为文本类型。

最好的方法是什么?

我找到的唯一解决方案涉及创建临时列,删除原始列,然后重命名,我想可能还有更好的方法吗?


文本列在磁盘上占用不同的空间。你不能只是让那个空间意味着不同的东西。即使在具有GUI允许“仅更改类型”的关系型数据库管理系统中,幕后也会创建一个新列并删除原始列。 - MatBailie
好的,你的意思是我需要创建一个新的列吗? - DaveB
为什么你可以。幕后发生了一些巨大的事情,但无论如何都是在服务器端。 - Michael Krelin - hacker
3个回答

47

您是否尝试了详细手册中的建议

ALTER TABLE table ALTER COLUMN anycol TYPE anytype;

根据当前类型和新类型,您可能需要在此语句中添加USING ...。但是在您的特定情况下,我认为这不是必需的。


如果我没记错的话,旧版本不支持。 - Craig Ringer
3
大多数情况下,这种方法运行良好,但测试始终有助于确保它在您的工作负载下能够很好地工作。假设您有40万亿行数据。使用此解决方案,它不会一次性处理所有行吗?在这种情况下,您可能希望将数据类型更改操作分批处理。为此,您需要一个临时列和/或表以批处理方式处理数据。 - Kuberchaun
2
修改列类型的实现方式是通过对整个表进行重写,而不是试图就地更新表数据。因此,对于大型表来说,这将需要相当长的时间和磁盘空间。用户需要自行决定是否采用更复杂的转换方法。 - araqnid
先生,我向您致敬。 - Gerardo BLANCO

13
ALTER TABLE table ALTER COLUMN card_id SET DATA TYPE text;

0
将现有的数字列转换为布尔值(在从Oracle迁移到PostgreSQL时遇到了这个问题),还需要删除和启用默认约束:
ALTER TABLE table_name 
    ALTER COLUMN column_name DROP DEFAULT,
    ALTER COLUMN column_name TYPE BOOLEAN 
         USING (case when column_name =1 then true else false end)::BOOLEAN,
    ALTER COLUMN column_name SET DEFAULT false;

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