Postgres 12 或更高版本
STORED生成的列随 Postgres 12 引入 - 正如 SQL 标准中所定义,并由一些 RDBMS(包括 DB2、MySQL 和 Oracle)实现。或者类似的“计算列”SQL Server 的。
简单的例子:
CREATE TABLE tbl (
int1 int
, int2 int
, product bigint GENERATED ALWAYS AS (int1 * int2) STORED
);
fiddle
VIRTUAL
生成的列可能会伴随下一次迭代之一。 (Postgres 16 中还没有)。
Related:
Postgres 11 或更早版本
Postgres 11 及以下版本不支持“生成的列”。
你可以效仿VIRTUAL
生成的列function using 属性表示法 (tbl.col
) that 外观和工作方式与虚拟生成列非常相似。这是由于历史原因而存在于 Postgres 中的一种语法奇怪现象,并且恰好符合这种情况。这个相关答案有代码示例:
表达式(看起来像列)不包含在SELECT * FROM tbl
, 尽管。您始终必须明确列出它。
也可以通过配套的支持表达指数- 假设函数是IMMUTABLE
. Like:
CREATE FUNCTION col(tbl) ... AS ... -- your computed expression here
CREATE INDEX ON tbl(col(tbl));
备择方案
或者,您可以使用以下方法实现类似的功能VIEW,可选地与表达式索引结合。然后SELECT *
可以包括生成的列。
“坚持”(STORED
)计算列可以通过以下方式实现triggers以功能等效的方式。
物化视图是一个相关的概念,自 Postgres 9.3 起实施.
在早期版本中,人们可以手动管理 MV。