A generated column is a special column that is always computed from other columns. Thus, it is for columns what a view is for tables. There are two kinds of generated columns: stored and virtual. A stored generated column is computed when it is written (inserted or updated) and occupies storage as if it were a normal column. A virtual generated column occupies no storage and is computed when it is read. Thus, a virtual generated column is similar to a view and a stored generated column is similar to a materialized view (except that it is always updated automatically). <productname>PostgreSQL</productname> currently implements only stored generated columns. 《マッチ度[91.415663]》生成列は常に他の列から計算される特別な列です。 ですから、これは列におけるテーブルに対するビューのようなものです。 生成列には格納と仮想の2種類があります。 格納生成列はそれが書かれた(挿入または更新)時に計算され、あたかも通常の列のようにストレージが割り当てられます。 仮想列にはストレージは割り当てられず、列が読み出された時に計算されます。 つまり、仮想生成列はビューに似ており、格納生成列はマテリアライズドビューに似ています。(常に自動的に更新される点は除きます。) 今の所PostgreSQLは格納生成列のみを実装しています。
To create a generated column, use the <literal>GENERATED ALWAYS
AS</literal> clause in <command>CREATE TABLE</command>, for example:
生成列を作るには、CREATE TABLE
でGENERATED ALWAYS AS
句を使ってください。例を示します。
CREATE TABLE people (
...,
height_cm numeric,
height_in numeric GENERATED ALWAYS AS (height_cm / 2.54) STORED
);
The keyword <literal>STORED</literal> must be specified to choose the
stored kind of generated column. See <xref linkend="sql-createtable"/> for
more details.
種類を格納生成列として選択するためにキーワードSTORED
を選択する必要があります。
より詳しくはCREATE TABLEをご覧ください。
A generated column cannot be written to directly. In
<command>INSERT</command> or <command>UPDATE</command> commands, a value
cannot be specified for a generated column, but the keyword
<literal>DEFAULT</literal> may be specified.
生成列には直接書き込みができません。
INSERT
あるいはUPDATE
コマンドでは値を生成列に指定できませんが、キーワードDEFAULT
が指定できます。
Consider the differences between a column with a default and a generated
column. The column default is evaluated once when the row is first
inserted if no other value was provided; a generated column is updated
whenever the row changes and cannot be overridden. A column default may
not refer to other columns of the table; a generation expression would
normally do so. A column default can use volatile functions, for example
<literal>random()</literal> or functions referring to the current time;
this is not allowed for generated columns.
デフォルトを備えた列と生成列の違いを考えてみましょう。
列のデフォルトは、他に値が指定されないときに、最初に行が挿入された時に一度だけ評価されます。
生成列は、行が変更された時に常に更新され、上書きはできません。
デフォルトを備えた列はテーブルの他の列を参照することはできませんが、生成式は通常それを行います。
デフォルトを備えた列は揮発性の関数、たとえばrandom()
や現在時刻を参照する関数を使用できますが、これは生成列では許されていません。
Several restrictions apply to the definition of generated columns and tables involving generated columns: 生成列の定義と生成列を伴うテーブルには以下の制限が適用されます。
The generation expression can only use immutable functions and cannot use subqueries or reference anything other than the current row in any way. 生成式は不変関数のみが使用でき、副問合せ、あるいは現在の行以外へのいかなる参照も使用できません。
A generation expression cannot reference another generated column. 生成式はほかの生成列を参照できません。
A generation expression cannot reference a system column, except
<varname>tableoid</varname>.
生成式はtableoid
以外のシステム列を参照できません。
A generated column cannot have a column default or an identity definition. 生成列は列デフォルトも識別定義も持てません。
A generated column cannot be part of a partition key. 生成列はパーティションキーの一部にはなれません。
Foreign tables can have generated columns. See <xref linkend="sql-createforeigntable"/> for details. 外部テーブルは生成列を持つことができます。 詳細はCREATE FOREIGN TABLEをご覧ください。
継承とパーティショニングの場合:
If a parent column is a generated column, its child column must also be a generated column; however, the child column can have a different generation expression. The generation expression that is actually applied during insert or update of a row is the one associated with the table that the row is physically in. (This is unlike the behavior for column defaults: for those, the default value associated with the table named in the query applies.) 親列が生成列である場合、その子列も生成列でなければなりません。 しかし、子列は異なる生成式を持つことができます。 行の挿入または更新時に実際に適用される生成式は、物理的に行が存在するテーブルに関連付けられたものです。 (これは列デフォルトの動作とは異なります。 列デフォルトの場合、問い合わせで指定されたテーブルに関連付けられたデフォルト値が適用されます。)
If a parent column is not a generated column, its child column must not be generated either. 親列が生成列でない場合、その子列も生成列であってはなりません。
For inherited tables, if you write a child column definition without
any <literal>GENERATED</literal> clause in <command>CREATE TABLE
... INHERITS</command>, then its <literal>GENERATED</literal> clause
will automatically be copied from the parent. <command>ALTER TABLE
... INHERIT</command> will insist that parent and child columns
already match as to generation status, but it will not require their
generation expressions to match.
継承されたテーブルの場合、CREATE TABLE ... INHERITS
にGENERATED
句を持たない子テーブル継承を書き込むと、そのGENERATED
句は自動的に親からコピーされます。
ALTER TABLE ... INHERIT
は、親列と子列が生成状態に一致していることを要求しますが、それらの生成式が一致することを要求しません。
Similarly for partitioned tables, if you write a child column
definition without any <literal>GENERATED</literal> clause
in <command>CREATE TABLE ... PARTITION OF</command>, then
its <literal>GENERATED</literal> clause will automatically be copied
from the parent. <command>ALTER TABLE ... ATTACH PARTITION</command>
will insist that parent and child columns already match as to
generation status, but it will not require their generation
expressions to match.
パーティション化されたテーブルの場合も同様です。
CREATE TABLE ... PARTITION OF
にGENERATED
句を持たない子テーブル継承を書き込むと、そのGENERATED
句は自動的に親からコピーされます。
ALTER TABLE ... ATTACH PARTITION
は、親列と子列が生成状態に一致していることを要求しますが、それらの生成式が一致することを要求しません。
In case of multiple inheritance, if one parent column is a generated column, then all parent columns must be generated columns. If they do not all have the same generation expression, then the desired expression for the child must be specified explicitly. 多重継承では、一つの親列が生成列なら、すべての親列は生成列でなければなりません。 すべての親列が同じ生成式を持たない場合は、子列の望ましい式を明示的に指定する必要があります。
Additional considerations apply to the use of generated columns. 生成列の利用の際には以下の追加の考慮が必要です。
Generated columns maintain access privileges separately from their underlying base columns. So, it is possible to arrange it so that a particular role can read from a generated column but not from the underlying base columns. 生成列は元になる基底列とは別にアクセス権限を維持します。 ですから、ある特定のロールが生成列を読み出しつつも、元になる基底列からは読み出さないように調整できます。
Generated columns are, conceptually, updated after
<literal>BEFORE</literal> triggers have run. Therefore, changes made to
base columns in a <literal>BEFORE</literal> trigger will be reflected in
generated columns. But conversely, it is not allowed to access
generated columns in <literal>BEFORE</literal> triggers.
概念的には、生成列はBEFORE
トリガが走った後に更新されます。
ですから、BEFORE
トリガの中で基底列に加えられた変更は生成列に反映されます。
しかし逆に生成列をBEFORE
トリガの中でアクセスすることは許されません。
Generated columns are skipped for logical replication and cannot be
specified in a <command>CREATE PUBLICATION</command> column list.
生成列はロジカルレプリケーションからスキップされ、CREATE PUBLICATION
の列リストでは指定できません。