将varchar字段的类型更改为整数:“不能自动转换为键入整数”
我有一个小表,并且某个字段包含类型“字符变化”。我试图将其更改为“整数”,但它给出了无法投射的错误。将varchar字段的类型更改为整数:“不能自动转换为键入整数”
是否有解决方法,或者我应该只是创建另一个表,并使用查询将记录带入它。
该字段只包含整数值。
有一个从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没有向您显示完整错误。这里,如果我在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的迁移,但其根本原因是相同的,答案适用。
与文本数据如果不小心或不混合整数你应该先执行以下更新命令(如果不是上述变更表会失败):
UPDATE the_table SET col_name = replace(col_name, 'some_string', '');
如果你想去掉不需要的字符和空格,你最好用'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)'
您是否尝试过使用数据进行此练习,并且您的数据是否完好? – itsols
只要列中的内容是整数,是 – bibangamba
它不适用于我。我正在使用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)'
以上会模仿你从其他数据库适配器知道是什么。如果您有非数字数据,结果可能会出乎意料(但毕竟转换为整数)。
我得到了同样的问题。 比我意识到我有一个默认的字符串值,我试图改变列。 删除默认值使得错误消失:)
你试过什么特定的ALTER TABLE和什么是特定的错误信息? –
@ muistooshort我尝试使用phppgadmin中的alter。选择列并尝试输入新的字段类型。错误是:'SQL错误: 错误:列“MID”不能被转换为类型整数' – itsols
首先是要备份表。然后你可以在同一个表中创建另一个整数类型的列(比如说field2)。选择转换为字段1的整数值到字段2。然后重命名该列。 – Igor