web-dev-qa-db-ja.com

データが変更されないままの場合、書き換えずに列のデータ型を変更する

例えば:

  • timestamp(tz)からint8
  • dateからint4
  • jsonからtext

生データは変更されず、唯一の違いはそのデータの処理方法です。ですから、きれいにそして即座に前後に変更することが可能であるべきです。

  1. これが実際に当てはまるかどうかを確認するにはどうすればよいですか?

  2. そうでない場合(テーブルが書き換えられる)、書き換えずにそれを行うにはどうすればよいですか?

2
dvtan

同様 ドキュメント は言う:

[...]既存の列のタイプを変更するには、テーブル全体とそのインデックスを書き換える必要があります。例外として、既存の列のタイプを変更するときに、USING句が列の内容を変更せず、古いタイプが新しいタイプに強制的にバイナリ強制できるか、新しいタイプに対する制約のないドメインの場合、テーブルの書き換えは必要ありません。ただし、影響を受ける列のインデックスは再構築する必要があります。

したがって、重要なのは、型変換がbinary coercibleであるということです。つまり、これらの型の間で型キャストが必要です_WITHOUT FUNCTION_ 。

これは、質問で言及したデータ型には当てはまりませんが、スーパーユーザーであれば、そのようなキャストを作成して、それを_ALTER TABLE_で使用できます。

_CREATE CAST (date AS int4) WITHOUT FUNCTION;
ALTER TABLE mytable ALTER datecol TYPE int4 USING (datecol::int4);
DROP CAST (date AS int4);
_

もちろん、それを理解するには、dateの内部表現を理解する必要があります。

型キャストをPostgreSQLに追加すると、エラーが発生する type resolution のあいまいさが簡単に発生する可能性があるため、キャスト後にキャストを削除することをお勧めします。

8
Laurenz Albe