將字串(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

  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