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

Posted

技术标签:

【中文标题】将列类型从整数更改为字符串【英文标题】:Changing a column type from integer to string 【发布时间】:2015-08-02 09:56:03 【问题描述】:

使用 PostgreSQL,将 integer 列类型迁移到 string 列类型的命令是什么?

显然我想通过将旧整数数据转换为字符串来保留数据。

【问题讨论】:

postgresql有TO_CHAR函数吗? 【参考方案1】:

您可以直接从INTEGER 转换为CHARACTER VARYING,您只需要ALTER TABLE 查询更改列类型:

SQL Fiddle

PostgreSQL 9.3 架构设置

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

Results

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

【讨论】:

关于外键的说明:如果您尝试从 int 更改为 character varying 的列是外键约束的目标,则必须删除外键约束在您能够在此答案中运行 ALTER TABLE 语句之前。您还需要更改引用原始列的列的类型,然后您可以重新创建外键约束。【参考方案2】:

我建议一个四步流程:

    创建一个新的字符串列。暂时将其命名为 temp。详情请见http://www.postgresql.org/docs/9.3/static/ddl-alter.html 设置字符串列。类似update myTable set temp=cast(intColumn as text) 的内容请参见http://www.postgresql.org/docs/9.3/static/functions-formatting.html 以获得更有趣的数字->字符串转换

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

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

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

【讨论】:

以上是关于将列类型从整数更改为字符串的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark 将列类型从日期更改为字符串

Sequelize PostgreSQL:将列类型字符串更改为字符串数组

在 ROR 迁移期间将列类型从 Date 更改为 DateTime

Oracle SQL 在包含数据时将列类型从数字更改为 varchar2

SQL Server 2012 如何将列的数据类型从位更改为日期字段?

postgreSQL 将列数据类型更改为没有时区的时间戳