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

带默认值的列和生成列之间存在一些差异。如果没有提供其他值,列默认值只在行首次插入时计算一次;生成列则会在行每次变化时更新,并且不能被覆盖。列默认值不能引用同一表中的其他列,而生成表达式通常会这样做。列默认值可以使用易失性函数,例如random()或引用当前时间的函数;生成列则不允许这样做。

生成列以及包含生成列的表在定义时有若干限制:

生成列的使用还有以下注意事项。