9.3 9.4 9.5 9.6 10 11 12 13 14 15 Current(16) 17
问题报告 纠错本页面

5.4. 生成列 #

生成列是一种特殊的列,它总是从其他列计算得出。因此,它对于列的作用就像视图对于表的作用。 生成列有两种类型:存储生成列和虚拟生成列。存储生成列在写入(插入或更新)时计算, 并占用存储空间,就像普通列一样。虚拟生成列不占用存储空间,在读取时计算。 因此,虚拟生成列类似于视图,而存储生成列类似于物化视图(不同的是它总是自动更新)。 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()或引用当前时间函数; 而对于生成列这是不允许的。

对于生成列和涉及生成列的表的定义,有以下几个限制:

对于使用生成列,需要考虑其他事项。