将string(varchar)列更改为整数
通过将字段类型从更改为integer来将string(varchar)列更改到的快速指南 string
到 long
.
描述 description
环境
Adobe Campaign Classic Adobe Campaign
问题
虽然当前为类型的表中的列 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://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必须重建整个表 (像一个满满的真空).