教学文章
Technology Exchange
热门课程
400电话

免费咨询热线
400-090-9964

教学文章

PostgreSQL教程-数据定义-生成列

时间:2021-10-09 来源:

5.3. 生成列

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

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

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

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

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

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

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

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

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

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

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

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

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

版权所有@北京神脑资讯技术有限公司(CUUG,中国UNIX用户协会) Copyright ALL Rights Reserved 京ICP备11008061号-1

CUUG旗下网站:www.cuug.com.cn www.cuug.com oracle.cuug.com bbs.cuug.com www.cuug.net

电话:010-59426307 010-59426319 邮政编码:100089

地址:北京市海淀区北清路164号28-38号院