Non esiste un cast (automatico) implicito da text
o varchar
a integer
(ovvero non è possibile passare varchar
a una funzione in attesa integer
o assegnare un varchar
campo a integer
uno), quindi è necessario specificare un cast esplicito utilizzando ALTER TABLE ... ALTER COLUMN ... TYPE. .. USANDO :
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (col_name::integer);
Nota che potresti avere 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);
rimuovere gli spazi bianchi prima della conversione.
Questo shoud è stato ovvio da un messaggio di errore se il comando è stato eseguito psql
, ma è possibile che PgAdmin-III non ti mostri l'errore completo. Ecco cosa succede se lo collaudo 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
link.
Vedi anche questa domanda correlata ; riguarda le migrazioni di Rails, ma la causa sottostante è la stessa e si applica la risposta.
Se l'errore persiste, è possibile che non sia correlato ai valori di colonna, ma gli indici su questa colonna o i valori predefiniti di colonna potrebbero non eseguire il typecast. Gli indici devono essere eliminati prima di ALTER COLUMN e ricreati dopo. I valori predefiniti devono essere modificati in modo appropriato.