将varchar字段的types更改为整数:“不能自动转换为整型”
我有一个小桌子,一个字段包含“ 字符变化 ”types。 我试图改变它为“ 整数 ”,但它给出了一个错误,铸造是不可能的。
有没有办法解决这个问题,或者我应该创build另一个表,并使用查询将logging带入其中。
该字段仅包含整数值。
没有从text
或varchar
到integer
隐式(自动) 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上的psql
testing它会发生什么:
=> 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值,我试图改变的列。 删除默认值使错误消失:)