Cambia il tipo di campo varchar in intero: “non può essere lanciato automaticamente per digitare numeri interi”

Ho una piccola tabella e un certo campo contiene il tipo ” carattere che varia “. Sto provando a cambiarlo in ” Integer ” ma dà un errore che il casting non è ansible.

C’è un modo per aggirare questo o dovrei solo creare un’altra tabella e portare i record in esso utilizzando una query.

Il campo contiene solo valori interi.

Non esiste un cast implicito (automatico) da text o varchar a integer (ovvero non è ansible passare un varchar a una funzione che prevede un integer o assegnare un campo varchar a uno integer ), 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 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 rimuovere lo spazio bianco prima della conversione.

Questo è stato ovvio da un messaggio di errore se il comando è stato eseguito in psql , ma è ansible che PgAdmin-III non ti mostri l’errore completo. Ecco cosa succede se lo collaudo 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 a @muistooshort per aver aggiunto il link USING .

Vedi anche questa domanda correlata ; riguarda le migrazioni di Rails, ma la causa sottostante è la stessa e la risposta è valida.

questo ha funzionato per me.

cambia colonna varchar in int

 change_column :table_name, :column_name, :integer 

avuto:

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

con

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

Prova questo, funzionerà sicuramente.

Quando si scrivono le migrazioni di Rails per convertire una colonna di stringhe in un intero, di solito si dice:

 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 sostanza ti dice che devi confermare che vuoi che questo accada e come i dati devono essere convertiti. Dillo solo nella tua migrazione:

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

Quanto sopra riprodurrà ciò 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).

Ho avuto lo stesso problema. Poi ho capito che avevo un valore di stringa predefinito per la colonna che stavo cercando di modificare. Rimuovendo il valore predefinito l’errore si è risolto 🙂

Puoi farlo come:

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

o prova questo:

 change_column :table_name, :column_name, :integer, using: 'column_name::integer' 

Se sei interessato a saperne di più su questo argomento leggi questo articolo: https://kolosek.com/rails-change-database-column

Se hai accidentalmente o meno interi misti con dati di testo, dovresti prima eseguire sotto il comando di aggiornamento (se non sopra alterare la tabella fallirà):

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

Se si sta lavorando sull’ambiente di sviluppo (o su per l’ambiente di produzione, può essere eseguito il backup dei dati), quindi prima cancellare i dati dal campo DB o impostare il valore su 0.

UPDATE table_mame SET field_name = 0;

Successivamente, per eseguire la query sottostante 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à.