Postgres11までの生成された列 SQL標準で定義され、DB2、MySQL、Oracleなどの一部のRDBMSによって実装されているため、サポートされていません。同様の「計算列」もありません SQLServerの。
STORED
生成された列はPostgres12で導入されます 。簡単な例:
CREATE TABLE tbl (
int1 int
, int2 int
, product bigint GENERATED ALWAYS AS (int1 * int2) STORED
);
db<>ここでフィドル
VIRTUAL
生成された列には、次の反復の1つが含まれる場合があります。 (Postgres 14にはまだありません)。
関連:
- 関数呼び出しの属性表記でエラーが発生する
それまで 、VIRTUAL
をエミュレートできます 関数で生成された列 属性表記を使用する (tbl.col
)仮想的に生成された列のように見え、機能します 。これは、歴史的な理由でPostgresに存在し、たまたまその場合に当てはまる構文上の奇妙なものです。この関連する回答にはコード例があります :
- 一般的なクエリを列として保存しますか?
式(列のように見える)はSELECT * FROM tbl
に含まれていません 、 けれど。常に明示的にリストする必要があります。
関数がIMMUTABLE
であれば、一致する式インデックスでサポートすることもできます。 。いいね:
CREATE FUNCTION col(tbl) ... AS ... -- your computed expression here
CREATE INDEX ON tbl(col(tbl));
代替案
または、VIEW
を使用して同様の機能を実装することもできます 、オプションで式インデックスと組み合わせます。次に、SELECT *
生成された列を含めることができます。
「永続的」(STORED
)計算列は、機能的に同じ方法でトリガーを使用して実装できます。
マテリアライズドビューは密接に関連する概念であり、Postgres 9.3以降に実装されています。
以前のバージョンでは、MVを手動で管理できます。