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:

  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 (preferita):

  1. Modifica lo schema. Cambia il tipo di campo da string a long.
  2. Durante UPDATE DB STRUCTURE, sostituire il comando ALTER con il comando ALTER seguente, 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/

      

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).

recommendation-more-help
3d58f420-19b5-47a0-a122-5c9dab55ec7f