sql >> Base de Datos >  >> RDS >> PostgreSQL

Cambiar el tipo de campo varchar a entero:no se puede convertir automáticamente para escribir entero

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.