Ä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:
- Introducera en tillfällig kolumn av typen
int. - Uppdatera databasen.
- Skapa ett arbetsflöde för att kopiera värdet från den ursprungliga kolumnen till den nya kolumnen.
- Ändra kolumntypen och uppdatera databasen.
- Skapa ett arbetsflöde för att kopiera värdet från kolumnen som introduceras i steg 1 till den ursprungliga kolumnen.
- Ta bort den tillfälliga kolumnen och uppdatera databasen.
Lösning 2 (standard):
- Redigera schemat. Ändra fälttypen från
stringtilllong. - Under
UPDATE DB STRUCTUREersätter du kommandotALTERmed kommandot nedanALTERsom ändrar kolumntypen tillINTEGER:
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).