PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Altere o tipo de campo varchar para inteiro:não pode ser convertido automaticamente para o tipo inteiro


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.