我有一个小表,某个字段包含类型“ 字符变化 ”。我正在尝试将其更改为“ Integer ”,但它给出了无法进行转换的错误。
有没有办法解决这个问题,或者我应该创建另一个表并使用查询将记录带入其中。
该字段仅包含整数值。
最佳答案
有一个从text
或varchar
到integer
没有隐含(自动)投(即你不能将一个varchar
的功能期待integer
或varchar
场分配给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/