我有一个小表,某个字段包含类型“ 字符变化 ”。我正在尝试将其更改为“ Integer ”,但它给出了无法进行转换的错误。

有没有办法解决这个问题,或者我应该创建另一个表并使用查询将记录带入其中。

该字段仅包含整数值。

最佳答案

有一个从textvarcharinteger没有隐含(自动)投(即你不能将一个varchar的功能期待integervarchar场分配给integer一个),所以你必须指定使用ALTER TABLE ... ALTER COLUMN ... TYPE ... USING显式转换:

ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (col_name::integer);

请注意,您的文本字段中可能有空格;在这种情况下,请使用:
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (trim(col_name)::integer);

在转换之前去除空白。

如果命令在 psql 中运行,这应该从错误消息中很明显,但 PgAdmin-III 可能没有向您显示完整的错误。如果我在 PostgreSQL 9.2 上的 psql 中测试它会发生以下情况:
=> CREATE TABLE test( x varchar );
CREATE TABLE
=> insert into test(x) values ('14'), (' 42  ');
INSERT 0 2
=> ALTER TABLE test ALTER COLUMN x TYPE integer;
ERROR:  column "x" cannot be cast automatically to type integer
HINT:  Specify a USING expression to perform the conversion.
=> ALTER TABLE test ALTER COLUMN x TYPE integer USING (trim(x)::integer);
ALTER TABLE

感谢 @muistooshort 添加 USING 链接。

另见 this related question ;这是关于 Rails 迁移,但根本原因是相同的,答案也适用。

如果错误仍然发生,那么它可能与列值无关,但此列或列默认值上的索引可能无法类型转换。索引需要在 ALTER COLUMN 之前删除并在之后重新创建。应适当更改默认值。

关于postgresql - 将 varchar 字段的类型更改为整数 : "cannot be cast automatically to type integer",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13170570/

10-16 17:13