★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

5.3. 生成列

生成列は常に他の列から計算される特別な列です。 ですから、これは列におけるテーブルに対するビューのようなものです。 生成列には格納と仮想の2種類があります。 格納生成列はそれが書かれた(挿入または更新)時に計算され、あたかも通常の列のようにストレージが割当てられます。 仮想列にはストレージは割り当てられず、列が読み出された時に計算されます。 つまり、仮想生成列はビューに似ており、格納生成列はマテリアライズドビューに似ています。(常に自動的に更新される点は除きます。) 今の所PostgreSQLは格納生成列のみを実装しています。

生成列を作るには、CREATE TABLEGENERATED ALWAYS AS節を使ってください。例を示します。

CREATE TABLE people (
    ...,
    height_cm numeric,
    height_in numeric GENERATED ALWAYS AS (height_cm / 2.54) STORED
);

種類を格納生成列として選択するためにキーワードSTOREDを選択する必要があります。 より詳しくはCREATE TABLEをご覧ください。

生成列には直接書き込みができません。 INSERTあるいはUPDATEコマンドでは値を生成列には指定できませんが、キーワードDEFAULTが指定できます。

デフォルトを備えた列と生成列の違いを考えてみましょう。 列のデフォルトは、他に値が指定されないときに、最初に行が挿入された時に一度だけ評価されます。 生成列は、行が変更された時に常に更新され、上書きはできません。 デフォルトを備えた列はテーブルの他の列を参照することはできませんが、生成式は通常それを行います。 デフォルトを備えた列は揮発性の関数、たとえばrandom()や現在時刻を参照する関数を使用できますが、これは生成列では許されていません。

生成列の定義と生成列を伴うテーブルには以下の制限が適用されます。

生成列の利用の際には以下の追加の考慮が必要です。