我有一个小表和某个字段包含类型“字符变化”。我试图将其更改为“整数”,但它给出了一个错误,casting是不可能的。

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

该字段只包含整数值。


当前回答

你可以这样做:

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

其他回答

这对我很管用。

将varchar column更改为int

change_column :table_name, :column_name, :integer

got:

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

如果你不小心把整数和文本数据混合了,你应该首先执行下面的update命令(如果不是上面的alter表将失败):

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

字符变化中的空字符串或空值

如果你有一个包含空字符串或null的列,你可能会遇到错误消息:

整数类型的输入语法无效:""

解决方案

使用coalesce和nullif来获取空字符串,使用nulls来获取零值。

ALTER TABLE peopleGroup ALTER numberPeople TYPE INT USING (cast ( coalesce( nullif( trim(numberPeople), '' ), '0' ) as integer ))

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

试试这个,一定会有用的。

当编写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)'

以上内容将模拟您从其他数据库适配器了解到的内容。如果您使用的是非数字数据,结果可能会出乎意料(但毕竟您正在转换为整数)。