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

时间:2012-11-01 03:33:11

标签: postgresql casting postgresql-9.1 fieldtype

我有一张小桌子,某个字段包含“字符变化”类型。我正在尝试将其更改为“整数”,但它会出现无法进行投射的错误。

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

该字段仅包含整数值。

8 个答案:

答案 0 :(得分:210)

textvarcharinteger没有隐式(自动)强制转换(即您无法将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迁移的,但根本原因是相同的,答案适用。

答案 1 :(得分:64)

this为我工作。

将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.

chnged to

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

答案 2 :(得分:10)

你可以这样做:

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

或试试这个:

change_column :table_name, :column_name, :integer, using: 'column_name::integer'

如果您有兴趣了解有关此主题的更多信息,请阅读以下文章:https://kolosek.com/rails-change-database-column

答案 3 :(得分:7)

试试这个,它肯定会起作用。

在编写Rails迁移以将字符串列转换为整数时,您通常会说:

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)'

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

答案 4 :(得分:3)

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

答案 5 :(得分:1)

我有同样的问题。我开始重置列的默认设置。

change_column :users, :column_name, :boolean, default: nil
change_column :users, :column_name, :integer, using: 'column_name::integer', default: 0, null: false

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

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

UPDATE table_mame SET field_name = 0;

然后运行以下查询并在成功运行查询之后,运行schemamigration,然后运行迁移脚本。

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

我认为它会对你有所帮助。