没有从文本或varchar到整数的隐式(自动)强制转换(即,您不能将varchar传递给期望整数的函数或将varchar字段分配给整数),因此必须使用
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
另见this related question;它是关于Rails迁移,但根本原因是相同的,答案适用。