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

问题描述:

我有一个小表,并且某个字段包含类型“字符变化”。我试图将其更改为“整数”,但它给出了无法投射的错误。将varchar字段的类型更改为整数:“不能自动转换为键入整数”

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

该字段只包含整数值。

+0

你试过什么特定的ALTER TABLE和什么是特定的错误信息? –

+0

@ muistooshort我尝试使用phppgadmin中的alter。选择列并尝试输入新的字段类型。错误是:'SQL错误: 错误:列“MID”不能被转换为类型整数' – itsols

+3

首先是要备份表。然后你可以在同一个表中创建另一个整数类型的列(比如说field2)。选择转换为字段1的整数值到字段2。然后重命名该列。 – Igor

有一个从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没有向您显示完整错误。这里,如果我在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   

感谢@muistooshort用于添加USING链接。

另请参阅this related question;这是关于Rails的迁移,但其根本原因是相同的,答案适用。

+0

谢谢您花时间。但我似乎无法得到这个工作。我尝试了你的ALTER行,它给了我一个错误“使用附近的语法错误” – itsols

+0

我的声明:ALTER TABLE“tblMenus”ALTER COLUMN“MID”USING(trim(“MID”):: integer); – itsols

+1

@itsols完全是我的错误;正如我看到您的评论一样,我纠正了它。见修订。这是正确的演示代码,只是不是一开始的通用示例。 –

与文本数据如果不小心或不混合整数你应该先执行以下更新命令(如果不是上述变更表会失败):

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

如果你想去掉不需要的字符和空格,你最好用'regexp_replace(col_name,'[^ 0-9。'','','g')'' 。不过,如果你想保留'NaN'和'Inf​​'和'10E42'科学记数法,你需要更复杂一些的东西。 –

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到

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

您是否尝试过使用数据进行此练习,并且您的数据是否完好? – itsols

+3

只要列中的内容是整数,是 – bibangamba

+0

它不适用于我。我正在使用ruby 2.2.3和rails 4.2.3 –

如果您在开发环境中工作(或生产ENV它的可能。备份你的数据),然后首先清除DB字段中的数据或将该值设置为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;

我认为它会帮助你。

试试这个,它肯定会有效。

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

以上会模仿你从其他数据库适配器知道是什么。如果您有非数字数据,结果可能会出乎意料(但毕竟转换为整数)。

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