将string(varchar)列更改为整数

通过将字段类型从string更改为long来将string(varchar)列更改为整数的快速指南。

描述 description

环境

  • Adobe Campaign Classic (ACC)
  • Adobe Campaign (AC)

问题

表中当前类型为string的列,它包含数字,并且将始终包含数字。

是否有办法将列的类型从varchar更改为int,同时不丢失已经存在的所有数字?

例如,可以执行alter命令(如下所示)或任何其他方法,例如:

alter table myTable alter column vColumn int;

解决方法 resolution

解决方案

解决方案1

  1. 引入类型为int的临时列。
  2. 更新数据库。
  3. 创建工作流以将原始列中的值复制到新列中。
  4. 更改列的类型并更新数据库。
  5. 创建工作流以将步骤1中介绍的列的值复制到原始列。
  6. 删除临时列并更新数据库。

解决方案2(首选)

  1. 编辑架构。 将字段类型从string更改为long
  2. UPDATE DB STRUCTURE期间,将ALTER命令替换为以下ALTER命令,这会将列类型更改为INTEGER

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

https://neon.tech/postgresql/postgresql-tutorial/postgresql-change-column-type

      

解决方案2 是最佳选项。  这正是我们为客户处理ALTER TABLE的方式。

ALTER TABLE也是良好的​ 数据类型验证器。 ​的问题。如果其中一行包含Alpha数据,则转换(ALTER TABLE)将弹回……  如果成功了,就一切就绪。

架构同样应为INT,而不是string,它会导致各种性能问题,即使使用3-4类RDS放大也无法解决。

如果有空间,建议创建备份表(包含索引)并安排时间:

select * into backup_nmsrecipient from nmsrecipient;

// add indexes to get accurate simulation

\timing

例如:

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

通常在不阻止的自定义表上执行此操作,因此请查看pg_stat_activity

如果nmsRecipient表很大,它可能会在此操作期间被阻止。

PostgreSQL必须重新生成整个表​ (如完全真空)

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