No hay conversión implícita (automática) de text o varchar a integer (es decir, no puede pasar un varchar a una función que espera integer o asigne un varchar campo a un integer uno), por lo que debe especificar una conversión explícita mediante ALTER TABLE... ALTER COLUMN... TYPE... USING:
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (col_name::integer);
Tenga en cuenta que puede tener espacios en blanco en sus campos de texto; en ese caso, utilice:
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (trim(col_name)::integer);
para eliminar los espacios en blanco antes de convertir.
Esto debería haber sido obvio a partir de un mensaje de error si el comando se ejecutó en psql , pero es posible que PgAdmin-III no le muestre el error completo. Esto es lo que sucede si lo pruebo en psql en 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
Gracias @muistooshort por agregar el USING enlace.
Ver también esta pregunta relacionada; se trata de migraciones de Rails, pero la causa subyacente es la misma y se aplica la respuesta.
Si el error persiste, es posible que no esté relacionado con los valores de la columna, pero los índices sobre esta columna o los valores predeterminados de la columna pueden fallar en la conversión de tipos. Los índices deben eliminarse antes de ALTER COLUMN y volver a crearse después. Los valores predeterminados deben cambiarse adecuadamente.