Redrock Postgres 搜索 英文
版本: 12 / 13 / 14 / 15 / 16

5.3. 生成列 #

生成列是一个特殊列,它总是根据其他列计算而来。因此,它对于列来说就像视图对于表一样。生成列有两种类型:存储的和虚拟的。存储的生成列在写入(插入或更新)时计算,并且占用存储空间,就像普通列一样。虚拟的生成列不占用存储空间,并且在读取时计算。因此,虚拟的生成列类似于视图,而存储的生成列类似于物化视图(除了它总是自动更新)。PostgreSQL 目前仅实现存储的生成列。

要创建生成列,请在 CREATE TABLE 中使用 GENERATED ALWAYS AS 子句,例如

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

必须指定关键字 STORED 以选择存储的生成列类型。有关更多详细信息,请参见 CREATE TABLE

无法直接写入生成列。在 INSERTUPDATE 命令中,无法为生成列指定值,但可以指定关键字 DEFAULT

考虑具有默认值和生成列的列之间的差异。如果未提供其他值,则在首次插入行时,列默认值将被评估一次;每当行更改且无法覆盖时,生成列都会被更新。列默认值可能不会引用表中的其他列;生成表达式通常会这样做。列默认值可以使用不稳定的函数,例如 random() 或引用当前时间的函数;生成列不允许这样做。

对涉及生成列的生成列和表的定义应用一些限制

生成列的使用需要考虑其他因素。