Non v'è implicita cast (automatico) da text
o varchar
-integer
(cioè non può passare un varchar
a una funzione in attesa integer
o assegnare un campo varchar
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);
Si noti che è possibile avere spazi bianchi nei campi di testo; in tal caso, utilizzare:
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (trim(col_name)::integer);
per rimuovere lo spazio bianco prima della conversione.
Questo shoud è stato evidente da un messaggio di errore se il comando è stato eseguito in psql
, ma è possibile che PgAdmin-III non ti mostri l'errore completo. Ecco cosa succede se provi nel 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 aggiungere il link USING
.
Vedere anche this related question; riguarda le migrazioni di Rails, ma la causa sottostante è la stessa e la risposta è valida.
fonte
2012-11-01 03:47:21
Quale specifico ALTER TABLE hai provato e quale era il messaggio di errore specifico? –
@muistooshort Ho provato a usare alter da phppgadmin. Selezionata la colonna e tentato di inserire il nuovo tipo di campo. L'errore è: 'Errore SQL: ERRORE: non è possibile eseguire il cast della colonna" MID "per digitare il numero intero – itsols
Il primo è eseguire il backup della tabella. Quindi puoi creare un'altra colonna (ad esempio field2) di tipo intero nella stessa tabella. Seleziona il cast per il valore intero del campo1 nel campo2. Quindi rinomina la colonna. – Igor