string (varchar)列を integer に変更しています
フィールドタイプを 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 で紹介した列の値を元の列にコピーします。
- temp カラムを削除してデータベースを更新します。
ソリューション 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 は datatype バリデーターとしても優れています。。行の 1 つにアルファ データがある場合、コンバージョン(ALTER TABLE)はバウンスします… 成功した場合は、すべて設定されています。
同様に、スキーマも string ではなく INT である必要があります。これにより、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 は(完全なバキュームと同様に)テーブル全体 再構築する必要 あります。