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

its*_*ols 141 postgresql casting fieldtype postgresql-9.1

我有一个小表,某个字段包含" 字符变化 " 类型.我正在尝试将其更改为" 整数 ",但它给出了一个错误,即无法进行转换.

有没有办法绕过这个或者我应该创建另一个表并使用查询将记录带入其中.

该字段仅包含整数值.

Cra*_*ger 236

没有隐式(自动)强制转换(text或者你不能将一个函数传递给期望的函数或将一个字段分配给一个函数),因此你必须使用ALTER TABLE ... ALTER COLUMN ... TYPE指定一个显式的强制转换. ..使用:varcharintegervarcharintegervarcharinteger

ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (col_name::integer);
Run Code Online (Sandbox Code Playgroud)

请注意,您的文本字段中可能包含空格; 在这种情况下,使用:

ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (trim(col_name)::integer);
Run Code Online (Sandbox Code Playgroud)

在转换之前剥去空白区域.

如果命令运行在错误消息中psql,这一点很明显,但PgAdmin-III可能没有向您显示完整错误.如果我psql在PostgreSQL 9.2上测试它会发生什么:

=> 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        
Run Code Online (Sandbox Code Playgroud)

感谢@muistooshort添加USING链接.

另见这个相关问题 ; 它是关于Rails迁移,但根本原因是相同的,答案适用.


bib*_*mba 67

对我有用.

将varchar列更改为int

change_column :table_name, :column_name, :integer
Run Code Online (Sandbox Code Playgroud)

拿到:

PG::DatatypeMismatch: ERROR:  column "column_name" cannot be cast automatically to type integer
HINT:  Specify a USING expression to perform the conversion.
Run Code Online (Sandbox Code Playgroud)

ch to to

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'
Run Code Online (Sandbox Code Playgroud)

  • 只要列中的内容是整数,是的 (3认同)

Nes*_*ric 14

你可以这样做:

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'
Run Code Online (Sandbox Code Playgroud)

或试试这个:

change_column :table_name, :column_name, :integer, using: 'column_name::integer'
Run Code Online (Sandbox Code Playgroud)

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


Sub*_*dra 7

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

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

change_column :table_name, :column_name, :integer
Run Code Online (Sandbox Code Playgroud)

但是,PostgreSQL会抱怨:

PG::DatatypeMismatch: ERROR:  column "column_name" cannot be cast automatically to type integer
HINT:  Specify a USING expression to perform the conversion.
Run Code Online (Sandbox Code Playgroud)

"提示"基本上告诉您需要确认是否要发生这种情况,以及如何转换数据.在您的迁移中说出这一点:

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'
Run Code Online (Sandbox Code Playgroud)

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

  • PG :: InvalidTextRepresentation:错误:整数的无效输入语法:“”发生错误 (2认同)

小智 7

我遇到过同样的问题。我开始重置该列的默认值。

change_column :users, :column_name, :boolean, default: nil
change_column :users, :column_name, :integer, using: 'column_name::integer', default: 0, null: false
Run Code Online (Sandbox Code Playgroud)


小智 5

我遇到了同样的问题。后来我意识到我要更改的列具有默认字符串值。删除默认值会使错误消失:)