【问题标题】:How to change column datatype from character to numeric in PostgreSQL 8.4如何在 PostgreSQL 8.4 中将列数据类型从字符更改为数字
【发布时间】:2011-12-02 18:12:19
【问题描述】:

我正在使用以下查询:

ALTER TABLE presales ALTER COLUMN code TYPE numeric(10,0); 

将列的数据类型从character(20) 更改为numeric(10,0),但出现错误:

列“代码”不能转换为数字类型

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    你可以试试USING:

    可选的USING 子句指定如何从旧列值计算新列值;如果省略,则默认转换与从旧数据类型到新数据类型的赋值转换相同。如果没有从旧类型到新类型的隐式或赋值强制转换,则必须提供 USING 子句。

    所以这可能有效(取决于您的数据):

    alter table presales alter column code type numeric(10,0) using code::numeric;
    -- Or if you prefer standard casting...
    alter table presales alter column code type numeric(10,0) using cast(code as numeric);
    

    如果code 中有任何不能转换为数字的内容,这将失败;如果 USING 失败,您必须在更改列类型之前手动清理非数字数据。

    【讨论】:

    • 此列在另一个表中用作外键,我想我也必须更改它的数据类型?
    • @user728630:您必须删除 FK,更改两列,然后重新添加 FK。您确实有一个可以使用的测试数据库和一个生产数据库的备份,对吧?
    • 我删除了外键约束,更改了数据类型,但之后无法添加 FK。收到以下错误错误:在表“发票”上插入或更新违反外键约束“invoice_presale_fk”详细信息:表“presales”中不存在键(sale,cpf_cnpj)=(4,05943560000101)。
    • @funwhilelost 那是type cast。链接的 ALTER TABLE 文档涵盖了您可以使用 USING 的内容。
    • @muistooshort 我从文档中看到它实际上是一个表达式。这更有意义。类型演员让我措手不及。我最终得到了TYPE varchar(255) USING (substring(formertextcolumn from 1 for 255))
    【解决方案2】:

    如果您的 VARCHAR 列包含空字符串(您可能还记得,这与 PostgreSQL 的 NULL 不同相同)您将不得不使用以下行中的内容来设置默认值:

    ALTER TABLE presales ALTER COLUMN code TYPE NUMERIC(10,0)
                USING COALESCE(NULLIF(code, '')::NUMERIC, 0);
    

    (在this answer的帮助下找到)

    【讨论】:

      【解决方案3】:

      第 1 步:根据您的要求添加带有整数或数字的新列

      第 2 步:将数据从 varchar 列填充到数字列

      第 3 步:删除 varchar 列

      第 4 步:根据旧的 varchar 列更改新的数字列名称

      【讨论】:

        猜你喜欢
        • 2021-12-28
        • 1970-01-01
        • 2010-10-06
        • 1970-01-01
        • 1970-01-01
        • 2013-01-24
        • 2018-09-26
        • 2015-08-02
        • 1970-01-01
        相关资源
        最近更新 更多