Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PostgreSQL 8.4中将列数据类型从字符更改为数字_Postgresql - Fatal编程技术网

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

如何在PostgreSQL 8.4中将列数据类型从字符更改为数字,postgresql,Postgresql,我使用以下查询: ALTER TABLE presales ALTER COLUMN code TYPE numeric(10,0); 要将列的数据类型从character(20)更改为numeric(10,0),但出现错误: “代码”列不能转换为数字类型 您可以尝试使用: 可选的USING子句指定如何从旧列计算新列值;如果省略,默认转换与从旧数据类型转换为新数据类型的赋值转换相同。如果没有从旧类型转换为新类型的隐式或赋值,则必须提供USING子句 因此,这可能会起作用(取决于您的数据):

我使用以下查询:

ALTER TABLE presales ALTER COLUMN code TYPE numeric(10,0); 
要将列的数据类型从
character(20)
更改为
numeric(10,0)
,但出现错误:

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

您可以尝试使用:

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

因此,这可能会起作用(取决于您的数据):


如果
code
中有无法转换为数字的内容,则此操作将失败;如果使用失败,您必须在更改列类型之前手动清理非数字数据。

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

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

(可在的帮助下找到)

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

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

步骤3:删除varchar列


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

此列在另一个表中用作外键,我想我也必须更改该列的数据类型?@user728630:您必须删除FK,更改两列,然后重新添加FK。您确实有一个测试数据库和生产数据库的备份,对吗?我删除了外键约束,更改了数据类型,但之后无法添加FK。获取以下错误:在表“发票”上插入或更新违反外键约束“发票预售”详细信息:表“预售”中不存在键(sale,cpf\u cnpj)=(405943560000101)。@funwhilelost这是一个错误。链接的ALTER TABLE文档涵盖了您可以使用的内容。@muistooshort我从文档中看到它实际上是一个表达式。这更有道理。这种类型的演员使我措手不及。最后,我使用(substring(formertextcolumn,从1到255))
键入varchar(255)
ALTER TABLE presales ALTER COLUMN code TYPE NUMERIC(10,0)
            USING COALESCE(NULLIF(code, '')::NUMERIC, 0);