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

5.4. 生成列 #

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

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

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

生成列默认是虚拟类型。使用 VIRTUALSTORED 关键字可以明确选择。有关更多详细信息,请参阅 CREATE TABLE

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

请注意列的默认值和生成列之间的区别。列的默认值在插入行时仅评估一次(如果未提供其他值);生成列在行发生更改时更新,并且不能被覆盖。列的默认值不能引用表中的其他列;而生成表达式通常会这样做。列的默认值可以使用易变函数(volatile functions),例如 random() 或引用当前时间的函数;这不允许用于生成列。

生成列以及包含生成列的表的定义有几个限制:

生成列的使用还有其他注意事项。