将varchar字段的类型更改为整数: "无法自动转换为整数类型"
问题出现的原因是将varchar字段的类型更改为integer时,无法自动转换为integer类型。解决方法是使用以下代码将字段类型更改为integer:
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字段自动转换为integer类型。解决方法是使用ALTER TABLE ... ALTER COLUMN ... TYPE ... USING进行显式转换。如果文本字段中包含空格,则需要在转换之前使用trim函数去掉空格。
在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
如果错误仍然发生,可能与该列上的索引或列默认值相关,这可能导致类型转换失败。在ALTER COLUMN之前必须删除索引,并在之后重新创建。默认值应相应更改。
大多数核心团队对PgAdmin不太感兴趣,他们很少使用它。它有一些令人讨厌的可用性问题和功能限制。这只是其中之一。因为很少有专家使用PgAdmin,所以他们没有动力修复他们对其感到烦恼的问题。我自己不使用它,因为我发现psql更快更容易。我曾经写过一篇关于备份和恢复方面的PgAdmin可用性的抱怨文章。
这个问题的解决方法对我帮助很大。我想知道为什么phppgadmin和pgadmin都没有这个功能... 大多数核心团队对PgAdmin不太感兴趣,他们很少使用它。它有一些令人讨厌的可用性问题和功能限制。这只是其中之一。因为很少有专家使用PgAdmin,所以他们没有动力修复他们对其感到烦恼的问题。
如果列包含非数字值,例如带有字母的数字,转换后会发生什么?可以尝试一下。'foo'::integer。会引发错误。我不记得postgres是否有非致命转换,但是可以使用正则表达式或like表达式对字符串进行模式匹配,如果看起来不合理,则跳过转换。