将string(varchar)列更改为整数

通过将字段类型从更改为integer来将string(varchar)列更改到的快速指南 stringlong.

描述 description

环境
Adobe Campaign Classic Adobe Campaign

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

是否可以通过以下方式更改列的类型 varcharint,而不会丢失所有已有的数字?

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

alter table myTable alter column vColumn int;

解决方法 resolution

解决方案

解决方案1

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

解决方案2(首选)

  1. 编辑架构。 更改字段类型 stringlong.
  2. 时段 UPDATE DB STRUCTURE,替换 ALTER 命令及以下内容 ALTER 命令,该命令会将列类型更改为 INTEGER

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

https://www.postgresqltutorial.com/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