この記事では、列の生成に関連する内容を紹介します。
概要
生成された列は、常に他の列から計算される特別な列です。 したがって、ビューがテーブルのためのものであるのは列のためです。 生成される列には、storedとvirtualの2種類があります。 格納された生成列は、書き込まれた (挿入または更新された) ときに計算され、通常の列であるかのようにストレージを占有します。 仮想生成列はストレージを占有せず、読み取り時に計算されます。 したがって、仮想生成列はビューと同様であり、格納された生成列はマテリアライズドビューと同様である (ただし、常に自動的に更新される) 。 PostgreSQLは現在、保存された生成列のみを実装しています。
生成された列を作成するには、create TABLEのgenerated ALWAYS AS句を使用します。
テーブルの人々を作成する (
...,
height_cm数値、
height_in数値は常に (height_cm / 2.54) STORED
);生成された列の格納種類を選択するには、キーワードSTOREDを指定する必要があります。
生成された列に直接書き込むことはできません。 INSERTまたはUPDATEコマンドでは、生成された列に値を指定できませんが、キーワードDEFAULTを指定できます。
デフォルトの列と生成された列の違いを考慮してください。 列の既定値は、他の値が指定されていない場合、行が最初に挿入されたときに1回評価されます。生成された列は、行が変更されるたびに更新され、オーバーライドできません。 列のデフォルトは、テーブルの他の列を参照することはできません。 列のデフォルトでは、random() や現在の時刻を参照する関数などの揮発性関数を使用できます。これは、生成された列では許可されません。
生成された列と生成された列を含むテーブルの定義には、いくつかの制限があります。
生成式は不変関数のみを使用でき、サブクエリを使用したり、現在の行以外を参照したりすることはできません。
生成式は別の生成された列を参照できません。
生成式は、
tableoidを除いて、システム列を参照できません。生成された列には、列のデフォルトまたはID定義を含めることはできません。
生成された列をパーティションキーの一部にすることはできません。
外部テーブルは列を生成できます。 詳細については、「FOREIGN TABLEの作成」をご参照ください。
継承の場合:
親列が生成された列である場合、子列も同じ式を使用して生成された列である必要があります。 子列の定義では、親からコピーされるため、
GENERATED句を省略します。多重継承の場合、1つの親列が生成された列である場合、すべての親列は同じ式で生成された列でなければなりません。
親列が生成列でない場合、子列は生成列であるか否かを定義することができる。
お知らせ
生成された列は、基礎となるベース列とは別にアクセス権を保持します。 したがって、特定のロールが生成された列から読み取ることができるが、基礎となるベース列からは読み取ることができないようにすることができます。
生成された列は、概念的には
BEFOREトリガーの実行後に更新されます。 したがって、BEFOREトリガーで基本列に加えられた変更は、生成された列に反映されます。 ただし、逆に、BEFOREトリガーで生成された列にアクセスすることはできません。