Ambiente
Adobe Campaign Classic Adobe Campaign
Problema
Colonna di una tabella che, sebbene sia attualmente di tipo string
, contiene numeri e contiene sempre numeri.
Esiste un modo per cambiare il tipo di colonna da varchar
a int
e non perdere tutti i numeri che ci sono già?
Ad esempio, esiste un modo per eseguire altera comando (come di seguito) o qualsiasi altro approccio come:
alter table myTable alter column vColumn int;
Soluzioni
Soluzione 1:
int
.Soluzione 2 (preferita):
string
a long
.UPDATE DB STRUCTURE
, sostituisci ALTER
con il comando sottostante ALTER
che modifica il tipo di colonna in INTEGER
:ALTER TABLE NmsRecipient ALTER COLONNA sBoardingPass TIPO INTEGER UTILIZZANDO sBoardingPass::integer;
https://www.postgresqltutorial.com/postgresql-change-column-type/
La Soluzione 2 è l'opzione migliore. È esattamente il modo in cui gestiamo il ALTER TABLE
per i clienti.
che ALTER TABLE
è anche bello convalida del tipo di dati.. Se una delle righe contiene dati alfa, la conversione (ALTER TABLE
) rimbalzerà… Se ha successo, allora siete tutti pronti.
Lo schema dovrebbe essere INT
, not string
, e causa tutti i tipi di problemi di prestazioni che non possono essere risolti anche con l'upsize RDS di classe 3-4.
Se si dispone di spazio, si consiglia di creare una tabella di backup (con indice) e di impostarla per l'ora:
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;
Di solito questo viene fatto su tabelle personalizzate che non bloccano, quindi guarda pg_stat_activity
.
Probabile se il nmsRecipient
La tabella è grande, verrà bloccata durante l'operazione.
PostgreSQL deve ricostruire l'intera tabella (come un vuoto pieno).