Non esiste un cast implicito (automatico) da text
o varchar
a integer
(cioè non puoi passare un varchar
a una funzione che si aspetta integer
oppure assegna un varchar
campo a un integer
uno), quindi è necessario specificare un cast esplicito utilizzando ALTER TABLE ... ALTER COLUMN ... TYPE ... USING:
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (col_name::integer);
Nota che potresti avere degli spazi bianchi nei tuoi campi di testo; in tal caso, utilizzare:
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (trim(col_name)::integer);
per eliminare lo spazio bianco prima della conversione.
Questo dovrebbe essere ovvio da un messaggio di errore se il comando è stato eseguito in psql
, ma è possibile che PgAdmin-III non mostri l'errore completo. Ecco cosa succede se lo provo in psql
su 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
Grazie @muistooshort per aver aggiunto il USING
collegamento.
Vedi anche questa domanda correlata; si tratta di migrazioni Rails, ma la causa sottostante è la stessa e la risposta è valida.
Se l'errore si verifica ancora, potrebbe non essere correlato ai valori di colonna, ma gli indici su questa colonna o i valori predefiniti della colonna potrebbero non riuscire a eseguire il typecast. Gli indici devono essere eliminati prima di ALTER COLUMN e ricreati dopo. I valori predefiniti devono essere modificati in modo appropriato.