將字串(varchar)欄變更為整數
將欄位型別從string變更為long以將字串(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