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:
- Introduza uma coluna temporária do tipo
int
. - Atualize o banco de dados.
- Crie um fluxo de trabalho para copiar o valor da coluna original na nova coluna.
- Altere o tipo da coluna e atualize o banco de dados.
- Crie um fluxo de trabalho para copiar o valor da coluna introduzida na Etapa 1 para a coluna original.
- Exclua a coluna temporária e atualize o banco de dados.
Solução 2 (Preferencial):
- Edite o esquema. Alterar o tipo de campo de
string
paralong
. - Durante
UPDATE DB STRUCTURE
, substitua o comandoALTER
pelo comandoALTER
abaixo, que altera o tipo de coluna paraINTEGER
:
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).