Não há conversão implícita (automática) de text
ou varchar
para integer
(ou seja, você não pode passar a varchar
para uma função esperando integer
ou atribuir um varchar
campo 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 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
Obrigado @muistooshort por adicionar o USING
link.
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.