Modifica della colonna string(varchar) in un numero intero

Ultimo aggiornamento: 2023-11-21

Guida rapida per convertire la colonna string(varchar) in numero intero modificando il tipo di campo da string a long.

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.

È possibile modificare il tipo di colonna da varchar a inte non perdere tutti i numeri che ci sono già?

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

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 alla nuova colonna.
  4. Modifica il tipo di colonna e aggiorna il database.
  5. Crea un flusso di lavoro per copiare il valore dalla colonna introduttiva nel passaggio 1 alla colonna originale.
  6. Elimina la colonna temporanea e aggiorna il database.

Soluzione 2 (preferito):

  1. Modifica lo schema. Cambia il tipo di campo da string a long.
  2. Durante UPDATE DB STRUCTURE, sostituisci ALTER comando con il comando seguente ALTER , che modifica il tipo di colonna in INTEGER:

ALTER TABLE NmsRecipient ALTER COLUMN sBoardingPass TYPE INTEGER USING sBoardingPass::integer;

https://www.postgresqltutorial.com/postgresql-change-column-type/

      

Soluzione 2 è l’opzione migliore.  È esattamente come gestiamo il ALTER TABLE per i clienti.

Questo ALTER TABLE è anche un buon convalida del tipo di dati…. Se una delle righe contiene dati alfa, la conversione (ALTER TABLE) non verrà recapitata… Se l'operazione ha esito positivo, è tutto pronto.

Analogamente, lo schema deve essere INT, non stringe 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;

Di solito questo viene fatto su tabelle personalizzate che non bloccano, quindi guarda pg_stat_activity.

Probabile se nmsRecipient la tabella è di grandi dimensioni, verrà bloccata durante l'operazione.

PostgreSQL deve ricreare l’intera tabella (come un vuoto pieno).

In questa pagina