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
は、また、良いです データ型バリデーター…。いずれかの行にアルファデータが含まれている場合、変換 (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 はテーブル全体を再構築する必要があります (完全な真空のように).