Documentación

Cambiando la columna cadena (varchar) a entera

Última actualización: 22 de noviembre de 2024

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:

  1. Introduzca una columna temporal de tipo int.
  2. Actualice la base de datos.
  3. Cree un flujo de trabajo para copiar el valor de la columna original en la nueva columna.
  4. Cambie el tipo de la columna y actualice la base de datos.
  5. Cree un flujo de trabajo para copiar el valor de la columna introducida en el paso 1 en la columna original.
  6. Elimine la columna temporal y actualice la base de datos.

Solución 2 (preferida):

  1. Edite el esquema. Cambie el tipo de campo de string a long.
  2. Durante UPDATE DB STRUCTURE, reemplace el comando ALTER por el siguiente comando ALTER, que cambia el tipo de columna a INTEGER:

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

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