举报投诉联系我们 手机版 热门标签 鳄鱼CMS
您的位置:鳄鱼CMS > PostgreSQL 生成列

PostgreSQL 生成列

2023-05-04 01:31 PostgreSQL 生成列

 PostgreSQL 生成列

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

生成列和涉及生成列的表的定义有几个限制:

  • 生成表达式只能使用不可变函数,并且不能使用子查询或以任何方式引用当前行以外的任何内容。

  • 生成表达式不能引用另一个生成列。

  • 生成表达式不能引用系统表,除了 tableoid

  • 生成列不能具有列默认或标识定义。

  • 生成列不能是分区键的一部分。

  • 外部表可以有生成列. 更多细节请参见 CREATE FOREIGN TABLE .

  • 对于继承:

    • 如果父列是生成的列,则子列也必须也是使用相同的表达式生成的列。 在子列的定义中,不再使用GENERATED子句,因为它将从父列复制过来。

    • 在进行多重继承的情况下,如果一个父列是生成的列,那么所有父列都必须是生成的列,并且具有相同的表达式。

    • 如果父列不是生成的列,子列可以定义是否为生成的列。

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

  • 生成列保留着有别于其下层的基础列的访问权限。因此,可以对其进行排列以便于从生成列中读取特定的角色,而不是从下层基础列。

  • 从概念上讲,生成列在BEFORE 触发器运行后更新。 因此,BEFORE 触发器中的基础列所做的变更将反映在生成列中。 但相反,不允许访问BEFORE 触发器中的生成列。


阅读全文
以上是鳄鱼CMS为你收集整理的 PostgreSQL 生成列全部内容。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
相关文章
  •  PostgreSQL 字符类型

    PostgreSQL 字符类型

    2023-04-02

    表8.4.字符类型名字描述character varying(n), varchar(n)有限制的变长character(n), char(n)定长,空格填充text无限...

  •  PostgreSQL pg_range

    PostgreSQL pg_range

    2023-06-01 PostgreSQL pg_range

    目录pg_range存储关于范围类型的信息。它是类型在pg_type中项的补充。表51.41.pg_range Columns列类型描述 rngtypidoid(referenc...

  •  PostgreSQL pg_available_extensions

    PostgreSQL pg_available_extensions

    2023-05-22

    pg_available_extensions视图列出了可用于安装的扩展。参见pg_extension目录,它显示当前已安装的扩展。表51.66.pg_available_ex...

  •  PostgreSQL 自协议2.0以来的变化总结

    PostgreSQL 自协议2.0以来的变化总结

    2023-06-21

    本节提供一个快速的改变检查列表,以便于那些试图将现有的客户端库更新到3.0协议的开发人员。初始化的启动包用了一个灵活的字符...

  • go 模板函数 GoFrame 模板函数-自定义函数

    go 模板函数 GoFrame 模板函数-自定义函数

    2023-04-07 GoFrame教程

    基本介绍开发者可以自定义模板函数,全局绑定模板函数到指定的视图对象中。也可以将自定义的对象赋值给模板,随后通过对象来调用...

© 2024 鳄鱼CMS eyucms.com 版权所有 联系我们