PG中的生成列(Generated Columns)

0    691    4

👉 本文共约1829个字,系统预计阅读时间或需7分钟。

简介

在pg12中create table语句支持GENERATED column(生成列)。

生成列是一个特殊的列,它总是从其他列计算而来。因此说,它对于列就像视图对于表一样。生成列有两种:存储列虚拟列。 存储生成列在写入(插入或更新)时计算,并且像普通列一样占用存储空间。虚拟生成列不占用存储空间并且在读取时进行计算。 如此看来,虚拟生成列类似于视图,存储生成列类似于物化视图(除了它总是自动更新之外)。 PostgreSQL目前只实现了存储生成列。

建立一个生成列,在 CREATE TABLE中使用 GENERATED ALWAYS AS 子句, 例如:

必须指定关键字 STORED 以选择存储类型的生成列。更多细节请参见 CREATE TABLE

生成列不能被直接写入.INSERTUPDATE 命令中, 不能为生成列指定值, 但是可以指定关键字DEFAULT

考虑列缺省情况和生成列之间的差异。 如果没有提供其他值,列缺省情况下在行被首次插入时计算一次;生成列则在行每次改变时进行更新,并且不能被取代。 列缺省情况下不能引用表的其他列;生成表达式通常会这样做。 列缺省情况下可以使用易失性函数,例如random()或引用当前时间函数; 而对于生成列这是不允许的。

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

本人提供Oracle、MySQL、PG等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!
  • 生成表达式只能使用不可变函数,并且不能使用子查询或以任何方式引用当前行以外的任何内容。
  • 生成表达式不能引用另一个生成列。
  • 生成表达式不能引用系统表,除了 tableoid
  • 生成列不能具有列默认或标识定义。
  • 生成列不能是分区键的一部分。
  • 外部表可以有生成列. 更多细节请参见 CREATE FOREIGN TABLE .
  • 对于继承:
    • 如果父列是生成的列,则子列也必须也是使用相同的表达式生成的列。 在子列的定义中,不再使用GENERATED子句,因为它将从父列复制过来。
    • 在进行多重继承的情况下,如果一个父列是生成的列,那么所有父列都必须是生成的列,并且具有相同的表达式。
    • 如果父列不是生成的列,子列可以定义是否为生成的列。

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

  • 生成列保留着有别于其下层的基础列的访问权限。因此,可以对其进行排列以便于从生成列中读取特定的角色,而不是从下层基础列。
  • 从概念上讲,生成列在BEFORE 触发器运行后更新。 因此,BEFORE 触发器中的基础列所做的变更将反映在生成列中。 但相反,不允许访问BEFORE 触发器中的生成列。

column_column_usage

PostgreSQL 12在information_schema下新增了column_column_usage系统表,该视图column_column_usage标识依赖于同一表中的另一个基本列生成的所有列。只包含当前启用的角色所拥有的表。column_column_usage系统表存储了生成列的有关信息。

名称数据类型描述
table_catalogsql_identifier包含表的数据库的名称(总是当前数据库)
table_schemasql_identifier包含表的模式的名称
table_namesql_identifier表的名称
column_namesql_identifier生成列所依赖的基本列的名称
dependent_columnsql_identifier生成的列的名称

示例

注意

  • 在insert语句和update语句中,不能为GENERATED column(生成列)指定value,除了default关键字
  • GENERATED column(生成列)的列值是物理存储在table中的
  • GENERATED column(生成列)不能作为partition key
  • 不能定义一个基于其他GENERATED column(生成列)的GENERATED column(生成列)

    头像

    小麦苗

    学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

    您可能还喜欢...

    发表评论

    您的电子邮箱地址不会被公开。

    4 × 3 =

     

    嘿,我是小麦,需要帮助随时找我哦
    • 18509239930
    • 个人微信

    • 麦老师QQ聊天
    • 个人邮箱
    • 点击加入QQ群
    • 个人微店

    • 回到顶部
    返回顶部