Cambiando la columna cadena (varchar) a entera
Una guía rápida para cambiar la columna de cadena (varchar) a un entero al cambiar el tipo de campo de string
a long
.
Descripción
Entornos
- Adobe Campaign Classic (ACC)
- Adobe Campaign (AC)
Problema
Columna de una tabla que, aunque actualmente es del tipo string
, contiene números y siempre contendrá números.
¿Existe alguna manera de cambiar el tipo de columna de varchar
a int
y no perder todos los números que ya existen?
Por ejemplo, ¿hay una forma de ejecutar alter command (como se muestra a continuación) o cualquier otro enfoque como:
alter table myTable alter column vColumn int;
Resolución
Soluciones
Solución 1:
- Introduzca una columna temporal de tipo
int
. - Actualice la base de datos.
- Cree un flujo de trabajo para copiar el valor de la columna original en la nueva columna.
- Cambie el tipo de la columna y actualice la base de datos.
- Cree un flujo de trabajo para copiar el valor de la columna introducida en el paso 1 en la columna original.
- Elimine la columna temporal y actualice la base de datos.
Solución 2 (preferida):
- Edite el esquema. Cambie el tipo de campo de
string
along
. - Durante
UPDATE DB STRUCTURE
, reemplace el comandoALTER
por el siguiente comandoALTER
, que cambia el tipo de columna aINTEGER
:
ALTER TABLE NmsRecipient ALTER COLUMN sBoardingPass TYPE INTEGER USING sBoardingPass::integer;
https://neon.tech/postgresql/postgresql-tutorial/postgresql-change-column-type
Solución 2 es la mejor opción. Así es exactamente como administramos ALTER TABLE
para los clientes.
Ese ALTER TABLE
también es un buen validador del tipo de datos s.. Si una de las filas tiene datos alfa, la conversión (ALTER TABLE
) rebotará… Si tiene éxito, entonces ya está todo listo.
El esquema de manera similar debería ser INT
, no string
, y causa todo tipo de problemas de rendimiento que no se pueden resolver ni siquiera con la conversión de RDS de clase 3-4.
Si tiene espacio, se recomienda crear una tabla de copia de seguridad (con índice) y cronometrarla:
select * into backup_nmsrecipient from nmsrecipient;
// add indexes to get accurate simulation
\timing
Por ejemplo:
ALTER TABLE backup_NmsRecipient ALTER COLUMN sBoardingPass TYPE INTEGER USING sBoardingPass::integer;
Normalmente, esto se hace en tablas personalizadas que no se bloquean, así que observe pg_stat_activity
.
Probablemente, si la tabla nmsRecipient
es grande, se bloqueará durante esta operación.
PostgreSQL debe reconstruir toda la tabla (como un vacío completo).