将varchar字段的types更改为整数:“不能自动转换为整型”

我有一个小桌子,一个字段包含“ 字符变化 ”types。 我试图改变它为“ 整数 ”,但它给出了一个错误,铸造是不可能的。

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

该字段仅包含整数值。

没有从textvarcharinteger隐式(自动) varchar转换(也就是说,不能将varchar传递给函数,期望integer或将varchar字段赋值为integer ),所以必须使用ALTER TABLE指定明确的强制转换。 ALTER COLUMN … TYPE …使用 :

 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上的psqltesting它会发生什么:

 => 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链接。

另见这个相关的问题 ; 这是关于Rails的迁移,但其根本原因是相同的,答案适用。

这对我工作。

将varchar列更改为int

 change_column :table_name, :column_name, :integer 

得到:

 PG::DatatypeMismatch: ERROR: column "column_name" cannot be cast automatically to type integer HINT: Specify a USING expression to perform the conversion. 

依附于

 change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)' 

试试这个,它肯定会工作的。

在编写Rails迁移来将string列转换为整数时,您通常会这样说:

 change_column :table_name, :column_name, :integer 

但是,PostgreSQL会抱怨:

 PG::DatatypeMismatch: ERROR: column "column_name" cannot be cast automatically to type integer HINT: Specify a USING expression to perform the conversion. 

“提示”基本上告诉你,你需要确认你想要发生这种情况,以及如何转换数据。 在你的迁移中说一下:

 change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)' 

以上将模仿您从其他数据库适配器了解的内容。 如果你有非数字的数据,结果可能是意想不到的(但毕竟转换为整数)。

如果你不小心或不把整数与文本数据混合,你应该首先执行下面的更新命令(如果不是上面的alter table将会失败):

 UPDATE the_table SET col_name = replace(col_name, 'some_string', ''); 

如果您正在开发环境(或生产环境上,它可能会备份您的数据),那么首先清除DB字段中的数据或将值设置为0。

UPDATE table_mame SET field_name = 0;

之后,运行下面的查询,并成功运行查询后,到schemamigration,然后运行迁移脚本。

ALTER TABLE table_mame ALTER COLUMN field_name TYPE数字(10,0)USING field_name :: numeric;

我认为这会帮助你。

我遇到了同样的问题。 比我意识到我有一个默认的string值,我试图改变的列。 删除默认值使错误消失:)