我有一张小桌子,某个字段包含“字符变化”类型。我正在尝试将其更改为“整数”,但它会出现无法进行投射的错误。
有没有解决方法,或者我应该创建另一个表并使用查询将记录带入其中。
该字段仅包含整数值。
答案 0 :(得分:210)
text
或varchar
到integer
没有隐式(自动)强制转换(即您无法将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;
我认为它会对你有所帮助。