Modifica della colonna string(varchar) in integer

Descrizione

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 inte 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;

Risoluzione

Soluzioni

Soluzione 1:

  1. Introdurre una colonna temporanea di tipo int.
  2. Aggiornare il database.
  3. Crea un flusso di lavoro per copiare il valore dalla colonna originale nella nuova colonna.
  4. Modificare il tipo di colonna e aggiornare il database.
  5. Crea un flusso di lavoro per copiare il valore dalla colonna introdotta nel Passaggio 1 alla colonna originale.
  6. Elimina la colonna temporanea e aggiorna il database.

Soluzione 2 (preferita):

  1. Modifica lo schema. Modificare il tipo di campo da string a long.
  2. Periodo 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).

In questa pagina