Alteração da coluna string(varchar) para inteiro

Um guia rápido para alterar a coluna de cadeia de caracteres (varchar) para um inteiro alterando o tipo de campo de string para long.

Descrição description

Ambiente

  • Adobe Campaign Classic
  • Adobe Campaign

Problema/Sintomas

Uma coluna em uma tabela que, embora atualmente seja do tipo string, contém números e sempre conterá números.

Existe uma maneira de alterar o tipo de coluna de varchar para int, e não perder todos os números que já estão lá?

Por exemplo, há uma maneira de executar o comando alter (como abaixo) ou qualquer outra abordagem como:

alter table myTable alter column vColumn int;

Resolução resolution

Soluções

Solução 1:

  1. Introduza uma coluna temporária do tipo int.
  2. Atualize o banco de dados.
  3. Crie um fluxo de trabalho para copiar o valor da coluna original na nova coluna.
  4. Altere o tipo da coluna e atualize o banco de dados.
  5. Crie um fluxo de trabalho para copiar o valor da coluna introduzida na Etapa 1 para a coluna original.
  6. Exclua a coluna temporária e atualize o banco de dados.

Solução 2 (Preferencial):

  1. Edite o esquema. Alterar o tipo de campo de string para long.
  2. Durante UPDATE DB STRUCTURE, substitua o comando ALTER pelo comando ALTER abaixo, que altera o tipo de coluna para INTEGER:

ALTER TABELA NmsRecipient ALTER COLUMN sBoboardingPass TIPO INTEIRO USANDO sBoboardingPass::integer;

https://www.postgresqltutorial.com/postgresql-change-column-type/

      

A Solução 2 é a melhor opção.  É exatamente como lidamos com o ALTER TABLE para clientes.

Que ALTER TABLE também é um bom validador de tipo de dados .. Se uma das linhas tiver dados alfa, a conversão (ALTER TABLE) será rejeitada…  Se tiver êxito, então você está pronto.

O esquema da mesma forma deveria ser INT, não string, e isso causa vários tipos de problemas de desempenho que não podem ser resolvidos mesmo com o upsizing de RDS de classe 3-4.

Se houver espaço, é recomendável criar uma tabela de backup (com índice) e cronometrá-la:

select * into backup_nmsrecipient from nmsrecipient;

// add indexes to get accurate simulation

\timing

Por exemplo:

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

Geralmente, isso é feito em tabelas personalizadas que não são bloqueadas, portanto, observe pg_stat_activity.

Provavelmente, se a tabela nmsRecipient for grande, ela será bloqueada durante essa operação.

O PostgreSQL precisa recompilar toda a tabela (como um vácuo completo).

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