如何在PostgreSQL 8.4中将列数据类型从字符更改为数字


136

我正在使用以下查询:

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

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

无法将“代码”列转换为数字类型

Answers:


240

您可以尝试使用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强制转换为数字,则此操作将失败;如果使用失败,则必须在更改列类型之前手动清理非数字数据。


此列用作另一个表中的外键,我想我也必须更改该数据类型?
user728630 2011年

2
@ user728630:您必须删除FK,更改两列,然后再添加FK。您确实有一个测试数据库可用于生产数据库的备份,对吗?
亩太短了,

我删除了外键约束,更改了数据类型,但此后无法添加FK。得到以下错误错误:在表“发票”上插入或更新违反了外键约束“ invoice_presale_fk”详细信息:表(presales)中不存在键(sale,cpf_cnpj)=(4,05943560000101)。
2011年

2
@funwhilelost这是类型转换。链接的ALTER TABLE文档涵盖了可以与USING一起使用的内容。
亩太短了

3
@muistooshort我从文档中看到它实际上是一个表达式。这更有意义。那种类型使我措手不及。我以TYPE varchar(255) USING (substring(formertextcolumn from 1 for 255))
funwhilelost

7

如果VARCHAR列包含空字符串(这是一样的NULLPostgreSQL的,你可能还记得),您将在下面设置一个默认的行使用的东西:

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

(在此答案的帮助下找到)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.