Não há conversão implícita (automática) de
text
ou varchar
para integer
(ou seja, você não pode passar um varchar
para uma função esperando integer
ou atribua um varchar
campo para um integer
one), então você deve especificar um cast explícito usando ALTER TABLE ... ALTER COLUMN ... TYPE ... USING:ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (col_name::integer);
Observe que você pode ter espaços em branco em 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 de converter.
Isso deveria ser óbvio a partir de uma mensagem de erro se o comando foi executado em
psql
, mas é possível que o PgAdmin-III não esteja mostrando o erro completo. Aqui está o que acontece se eu testar em psql
no 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 Rails, mas a causa subjacente é a mesma e a resposta se aplica.
Se o erro ainda ocorrer, ele pode não estar relacionado aos valores da coluna, mas os índices sobre esta coluna ou os valores padrão da coluna podem falhar no typecast. Os índices precisam ser descartados antes de ALTER COLUMN e recriados depois. Os valores padrão devem ser alterados adequadamente.