Não há conversão implícita (automática) de textou varcharpara integer(ou seja, você não pode passar a varcharpara uma função esperando integerou atribuir um varcharcampo a uma integer), portanto, você deve especificar uma conversão explícita usando ALTER TABLE ... ALTER COLUMN ... TYPE. .. USANDO :
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (col_name::integer);
Observe que você pode ter espaços em branco nos seus campos de texto; nesse caso, use:
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (trim(col_name)::integer);
para remover o espaço em branco antes da conversão.
Isso deve ser óbvio em uma mensagem de erro se o comando foi executado psql, mas é possível que o PgAdmin-III não esteja mostrando o erro completo. Aqui está o que acontece se eu testá-lo no psqlPostgreSQL 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
Obrigado @muistooshort por adicionar o USINGlink.
Veja também esta questão relacionada ; trata-se de migrações do Rails, mas a causa subjacente é a mesma e a resposta se aplica.
Se o erro ainda ocorrer, ele pode estar relacionado não aos valores da coluna, mas os índices nessa coluna ou nos valores padrão da coluna podem falhar na conversão de tipo. Os índices precisam ser eliminados antes de ALTER COLUMN e recriados depois. Os valores padrão devem ser alterados adequadamente.