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
Ambienti
- Adobe Campaign Classic (ACC)
- Adobe Campaign (AC)
Problema
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
stringalong. - Durante
UPDATE DB STRUCTURE, sostituire il comandoALTERcon il comandoALTERseguente, che modifica il tipo di colonna inINTEGER:
ALTER TABLE NmsRecipient ALTER COLUMN sBoardingPass TYPE INTEGER USING sBoardingPass::integer;
https://neon.tech/postgresql/postgresql-tutorial/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).