2012-11-01 14 views
112

Ho una tabella piccola e un determinato campo contiene il tipo "carattere variabile". Sto cercando di cambiarlo in "Numero intero", ma dà un errore che il casting non è possibile.Cambia il tipo di campo varchar in intero: "non può essere eseguito automaticamente per digitare il numero intero"

C'è un modo per aggirare questo o dovrei semplicemente creare un'altra tabella e portarvi i record usando una query.

Il campo contiene solo valori interi.

+0

Quale specifico ALTER TABLE hai provato e quale era il messaggio di errore specifico? –

+0

@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

+3

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

risposta

173

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.

+0

Grazie per aver dedicato del tempo. Ma non riesco a farlo funzionare. Ho provato la tua linea ALTER e mi dà un errore "Errore di sintassi vicino all'utilizzo" – itsols

+0

La mia affermazione: ALTER TABLE "tblMenus" ALTER COLUMN "MID" USING (trim ("MID") :: intero); – itsols

+1

@itsols Interamente il mio errore; L'ho corretto proprio nel momento in cui ho visto il tuo commento. Vedi rivisto. Era giusto nel codice demo, ma non l'esempio generico all'inizio. –

0

interi Se hai misti accidentalmente o meno con i dati di testo che si dovrebbe in un primo momento l'esecuzione di sotto comando di aggiornamento (se non soprattutto alter table fallirà):

UPDATE the_table SET col_name = replace(col_name, 'some_string', ''); 
+2

Ti starai meglio con qualcosa come 'regexp_replace (col_name, '[^ 0-9.]', '', 'G')' se stai cercando di eliminare caratteri indesiderati e spazi bianchi . Avresti bisogno di qualcosa di un po 'più sofisticato se vuoi mantenere la notazione scientifica 'NaN' e' Inf' e '10E42', comunque. –

55

this ha lavorato per me.

cambiamento colonna varchar a int

change_column :table_name, :column_name, :integer 

ottenuto:

PG::DatatypeMismatch: ERROR: column "column_name" cannot be cast automatically to type integer 
HINT: Specify a USING expression to perform the conversion. 

chnged a

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)' 
+0

hai provato questo esercizio con i dati e i tuoi dati sono stati intatti? – itsols

+3

finché ciò che è nella colonna è un numero intero, sì – bibangamba

+0

Non funziona con me. Sto usando ruby ​​2.2.3 con rails 4.2.3 –

0

Se si sta lavorando su ambiente di sviluppo (o per ENV produzione di esso può. effettuare il backup dei dati) quindi prima cancellare i dati dal campo DB o impostare il valore come 0.

UPDATE table_mame SET field_name = 0;

Successivamente, per eseguire la query seguente e dopo aver eseguito correttamente la query, in schemamigration e successivamente eseguire lo script di migrazione.

ALTER TABLE nome_tabella ALTER COLUMN nome_campo TYPE numeric (10,0) USING nome_campo :: numerico;

Penso che ti aiuterà.

6

Prova questo, funzionerà sicuramente.

Quando si scrive Rails migrazioni per convertire una colonna stringa in un intero che ci si solito dire:

change_column :table_name, :column_name, :integer 

Tuttavia, PostgreSQL si lamenterà:

PG::DatatypeMismatch: ERROR: column "column_name" cannot be cast automatically to type integer 
HINT: Specify a USING expression to perform the conversion. 

Il "suggerimento" in pratica si dice che devi confermare che vuoi che questo accada e come i dati devono essere convertiti. Dì questo nella tua migrazione:

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)' 

Quanto sopra riprodurrà quello che sai da altri adattatori di database. Se si dispone di dati non numerici, i risultati potrebbero essere inattesi (ma in definitiva si sta convertendo in un numero intero).

1

Ho avuto lo stesso problema. Poi ho capito che avevo un valore di stringa predefinito per la colonna che stavo cercando di modificare. Rimuovere il valore predefinito ha fatto sparire l'errore :)