Redrock Postgres 搜索 英文
版本: 12 / 13 / 14 / 15 / 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() 或引用当前时间的函数;生成列不允许这样做。

对生成列的定义和涉及生成列的表的定义会应用几个限制

生成列的使用还适用于附加注意事项。