PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Cambia il tipo di campo varchar in intero:non è possibile eseguire automaticamente il cast per digitare integer

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.