将列类型从整数更改为字符串

10
使用PostgreSQL,将一个integer列类型迁移到string列类型的命令是什么?
显然,我希望通过将旧的整数数据转换为字符串来保留数据。

PostgreSQL 有 TO_CHAR 函数吗? - wallyk
2个回答

17
你可以直接将INTEGER转换为CHARACTER VARYING,只需要使用ALTER TABLE查询更改列类型即可:

SQL Fiddle

PostgreSQL 9.3 Schema Setup:

CREATE TABLE tbl (col INT);
INSERT INTO tbl VALUES (1), (10), (100);
ALTER TABLE tbl ALTER COLUMN col TYPE CHARACTER VARYING(10);

查询 1:

SELECT col, pg_typeof(col) FROM tbl

结果:

| col |         pg_typeof |
|-----|-------------------|
|   1 | character varying |
|  10 | character varying |
| 100 | character varying |

1
关于外键的注意事项:如果你试图将一个列从 int 类型更改为 character varying 类型,并且该列是一个外键约束的目标,那么在运行本答案中的 ALTER TABLE 语句之前,你必须先删除外键约束。你还需要修改引用原始列的列的类型,然后重新创建外键约束。 - Jeremy

0

我建议采用以下四个步骤:

  1. 创建一个新的字符串列。暂时将其命名为temp。有关详细信息,请参见http://www.postgresql.org/docs/9.3/static/ddl-alter.html
  2. 设置字符串列。例如:update myTable set temp=cast(intColumn as text),有关更多有趣的数字->字符串转换,请参见http://www.postgresql.org/docs/9.3/static/functions-formatting.html

确保temp中的所有内容看起来都符合您的要求。

  1. 删除旧的整数列。再次参见http://www.postgresql.org/docs/9.3/static/ddl-alter.html了解详情
  2. 将temp重命名为旧列名。同样:http://www.postgresql.org/docs/9.3/static/ddl-alter.html

这假定您可以在没有客户端连接的情况下执行操作;离线。如果您需要在在线表中进行此(激烈的)更改,请考虑设置具有实时更新触发器的新表,然后在原子操作中切换到新表。请参见ALTER TABLE without locking the table?


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