Postgresql 中文操作指南

5.3. Generated Columns #

生成的列是一个特殊列,它始终根据其他列计算出来。因此,它对于列而言就相当于视图对于表格而言。有两种类型的生成列:存储和虚拟。存储生成的列在写入(插入或更新)时计算,并占用存储空间,就好像它是普通列一样。虚拟生成的列不占用存储空间,并在读取时计算。因此,虚拟生成的列类似于视图,而存储生成的列类似于物化视图(但它始终会自动更新)。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() 或引用当前时间的函数;这不适用于生成的列。

对涉及生成列的生成列和表格的定义适用于一些限制:

对使用生成列的应用程序适用其他注意事项。