Ändra strängkolumnen (varchar) till heltal

En snabbguide för att ändra strängkolumnen (varchar) till ett heltal genom att ändra fälttypen från string till long.

Beskrivning description

Miljö

  • Adobe Campaign Classic (ACC)
  • Adobe Campaign (AC)

Utgåva

En kolumn i en tabell som även om den för närvarande är av typen string innehåller tal och alltid innehåller siffror.

Finns det ett sätt att ändra kolumntypen från varchar till int och inte att förlora alla tal som redan finns där?

Det finns t.ex. ett sätt att köra Alt-kommandot (som nedan) eller något annat sätt som:

alter table myTable alter column vColumn int;

Upplösning resolution

Lösningar

Lösning 1:

  1. Introducera en tillfällig kolumn av typen int.
  2. Uppdatera databasen.
  3. Skapa ett arbetsflöde för att kopiera värdet från den ursprungliga kolumnen till den nya kolumnen.
  4. Ändra kolumntypen och uppdatera databasen.
  5. Skapa ett arbetsflöde för att kopiera värdet från kolumnen som introduceras i steg 1 till den ursprungliga kolumnen.
  6. Ta bort den tillfälliga kolumnen och uppdatera databasen.

Lösning 2 (standard):

  1. Redigera schemat. Ändra fälttypen från string till long.
  2. Under UPDATE DB STRUCTURE ersätter du kommandot ALTER med kommandot nedan ALTER som ändrar kolumntypen till INTEGER:

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

https://neon.tech/postgresql/postgresql-tutorial/postgresql-change-column-type

      

Lösning 2 är det bästa alternativet.  Det är precis så vi hanterar ALTER TABLE för kunder.

ALTER TABLE är också en giltig datatypsvalidator.. Om en av raderna har alfavärden studsar konverteringen (ALTER TABLE)…  Om det lyckas är du redo.

Schemat ska på liknande sätt vara INT, inte string, och det orsakar alla typer av prestandaproblem som inte kan lösas även med 3-4-klassers RDS-uppbyggnad.

Om du har utrymme bör du skapa en säkerhetskopieringstabell (med index) och göra följande:

select * into backup_nmsrecipient from nmsrecipient;

// add indexes to get accurate simulation

\timing

Exempel:

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

Vanligtvis görs detta för anpassade tabeller som inte blockerar, så titta på pg_stat_activity.

Om tabellen nmsRecipient är stor blockeras den troligen under den här åtgärden.

PostgreSQL måste återskapa hela tabellen (som ett fullständigt vakuum).

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