Modifica della colonna string(varchar) in un numero intero
Guida rapida per modificare la colonna string(varchar) in un numero intero modificando il tipo di campo da string
a long
.
Descrizione description
Ambiente
- Adobe Campaign Classic
- Adobe Campaign
Problema/Sintomi
Colonna di una tabella che, sebbene sia attualmente di tipo string
, contiene numeri e conterrà sempre numeri.
Esiste un modo per cambiare il tipo di colonna da varchar
a int
e non perdere tutti i numeri già presenti?
Ad esempio, esiste un modo per eseguire il comando alter (come indicato di seguito) o qualsiasi altro approccio come:
alter table myTable alter column vColumn int;
Risoluzione resolution
Soluzioni
Soluzione 1:
- Introdurre una colonna temporanea di tipo
int
. - Aggiornare il database.
- Crea un flusso di lavoro per copiare il valore dalla colonna originale alla nuova colonna.
- Modifica il tipo di colonna e aggiorna il database.
- Crea un flusso di lavoro per copiare il valore dalla colonna introduttiva nel passaggio 1 alla colonna originale.
- Elimina la colonna temporanea e aggiorna il database.
Soluzione 2 (preferita):
- Modifica lo schema. Cambia il tipo di campo da
string
along
. - Durante
UPDATE DB STRUCTURE
, sostituire il comandoALTER
con il comandoALTER
seguente, che modifica il tipo di colonna inINTEGER
:
ALTER TABLE NmsRecipient ALTER COLUMN sBoardingPass TYPE INTEGER USING sBoardingPass::integer;
https://www.postgresqltutorial.com/postgresql-change-column-type/
La soluzione 2 è la migliore. È esattamente come gestiamo ALTER TABLE
per i clienti.
ALTER TABLE
è anche un buon validatore del tipo di dati.. Se una delle righe contiene dati alfa, la conversione (ALTER TABLE
) non verrà eseguita… Se funziona, è tutto pronto.
Lo schema deve essere INT
e non string
e causa tutti i tipi di problemi di prestazioni che non possono essere risolti nemmeno con l'upsize di RDS di classe 3-4.
Se disponi di spazio, è consigliabile creare una tabella di backup (con indice) e impostarla come segue:
select * into backup_nmsrecipient from nmsrecipient;
// add indexes to get accurate simulation
\timing
Ad esempio:
ALTER TABLE backup_NmsRecipient ALTER COLUMN sBoardingPass TYPE INTEGER USING sBoardingPass::integer;
In genere questa operazione viene eseguita su tabelle personalizzate che non bloccano, quindi guarda pg_stat_activity
.
È probabile che se la tabella nmsRecipient
è grande, verrà bloccata durante l'operazione.
PostgreSQL deve ricreare l'intera tabella (come un vuoto completo).