No hay conversión implícita (automática) de text
o varchar
a integer
(es decir, no puede pasar un varchar
a una función que espera integer
o asigne un varchar
campo a un integer
uno), por lo que debe especificar una conversión explícita mediante ALTER TABLE... ALTER COLUMN... TYPE... USING:
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, utilice:
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (trim(col_name)::integer);
para eliminar los espacios en blanco antes de convertir.
Esto debería haber sido obvio a partir de un mensaje de error si el comando se ejecutó en psql
, pero es posible que PgAdmin-III no le muestre el error completo. Esto es lo que sucede si lo pruebo en psql
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, es posible que no esté relacionado 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 tipos. Los índices deben eliminarse antes de ALTER COLUMN y volver a crearse después. Los valores predeterminados deben cambiarse adecuadamente.