No hay conversión implícita (automática) desde text
o varchar
hacia integer
(es decir, no puede pasar un varchar
a una función esperando integer
o asignar un varchar
campo a integer
uno), por lo que debe especificar una conversión explícita utilizando ALTER TABLE ... ALTER COLUMN ... TYPE. .. USANDO :
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, use:
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (trim(col_name)::integer);
para quitar espacios en blanco antes de convertir.
Esto debería ser obvio por un mensaje de error si el comando se ejecutó psql
, pero es posible que PgAdmin-III no muestre el error completo. Esto es lo que sucede si lo psql
pruebo 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, puede estar relacionado no 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 texto. Los índices deben descartarse antes de ALTERAR COLUMNA y recrearse después. Los valores predeterminados deben cambiarse adecuadamente.