Alteração da coluna de string (varchar) para integer

Descrição

Ambiente
Adobe Campaign Classic Adobe Campaign

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

Existe uma maneira de alterar o tipo de coluna de varchar para inte não perder todos os números que já existem?

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

alter table myTable alter column vColumn int;

Resolução

Soluções

Solução 1:

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

Solução 2 (preferencial):

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

ALTERAR A TABELA NmsRecipient ALTER COLUMN SBoEuropaPass TYPE INTEIER USANDO sBoEuropaPass::integer;

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

      

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

Essa ALTER TABLE também é um bom validador de tipo de dados.. Se uma das linhas tiver dados alfa, a conversão (ALTER TABLE) rejeitará…  Se for bem-sucedido, então você está pronto.

O esquema deve ser INT, não stringe causa todos os tipos de problemas de desempenho que não podem ser resolvidos mesmo com o redimensionamento de RDS de 3 a 4 classes.

Se tiver espaço, é recomendável criar uma tabela de backup (com índice) e hora:

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;

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

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

O PostgreSQL deve reconstruir a tabela inteira (como um vácuo completo).

Nesta página