将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:
- 引入类型为
int的临时列。 - 更新数据库。
- 创建工作流以将原始列中的值复制到新列中。
- 更改列的类型并更新数据库。
- 创建工作流以将步骤1中介绍的列的值复制到原始列。
- 删除临时列并更新数据库。
解决方案2(首选):
- 编辑架构。 将字段类型从
string更改为long。 - 在
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