PostgreSQL生成列实现过程介绍

 更新时间:2023年01月12日 10:13:20   作者:梦想画家  
PostgreSQL 12 增加新的特性——生成列(Generated Columns),也就是计算列。在之前版本也可以实现,但需要定义函数和触发器,利用该功能可以更容易使用并可以提升性能。生成列是给表指定计算列,其数据可以根据其他列数据自动生成,当原数据更新时其自动更新
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

PostgreSQL中生成列是从其他列计算而来的特殊列。生成列与普通列不同,不是固定的值,而是又引用表中其他列的表达式决定的。生成列在SQL标准(ISO/IEC 9075)中引入,被主流RDBMS支持,PostgreSQL12开始支持生成列。

示例

下面首先创建一张表,用于演示PostgreSQL生成列:

CREATE TABLE Students (
  Id INTEGER PRIMARY KEY,
  FirstName VARCHAR(50),
  LastName VARCHAR(50),
  FullName VARCHAR(101) GENERATED ALWAYS AS (FirstName || ' ' || LastName) STORED
);

上面示例中最后一列是生成列,PostgreSQL生成列在定义中必须有GENERATED ALWAYS(通常其他关系型数据库为可选)。另外生成列结尾必须有STORED。这指定了生成列需要被存储(相对于virtual,下面有解释),其他关系型数据库这通常也是可选的(默认值为virtual)。

生成列的语法如下:

<column_name> <datatype> GENERATED ALWAYS AS(expression) [STORED|VIRTUAL]

在GENERATED ALWAYS AS (expression) Stored子句中,使用现有的列指定生成列表达式,为生成列计算值。

现在我们已经创建了带生成列的表,下面插入数据:

INSERT INTO Students (Id, FirstName, LastName) 
VALUES (0001, 'Lucy', 'Green');
INSERT INTO Students (Id, FirstName, LastName) 
VALUES (0002, 'Aziz', 'Ahmad');
INSERT INTO Students (Id, FirstName, LastName) 
VALUES (0003, 'Zohan', 'Ahuja');
INSERT INTO Students (Id, FirstName, LastName) 
VALUES (0004, 'Homer', 'Presley');
INSERT INTO Students (Id, FirstName, LastName) 
VALUES (0005, 'Sally', 'Smith');

注意,我们插入数据不包括生成列,现在查看数据:

SELECT * FROM Students;

结果为:

 id | firstname | lastname |   fullname    
----+-----------+----------+---------------
  1 | Lucy      | Green    | Lucy Green
  2 | Aziz      | Ahmad    | Aziz Ahmad
  3 | Zohan     | Ahuja    | Zohan Ahuja
  4 | Homer     | Presley  | Homer Presley
  5 | Sally     | Smith    | Sally Smith

我们看到生成列包含FirstName和LastName两列值的连接串。生成列表达式不仅为字符串连接,举例:一些场景中需要基于原价和折扣计算实际价格。

Stored vs Virtual

生成列可以为 stored 或 virtual. 两者的差异为:

  • STORED (aka 持久化): 列值被存储在表里. 当写(插入或更新)时存储列被重新计算,并像普通列一样占用存储空间。
  • VIRTUAL: 虚拟生成列不占用存储空间,仅当读时才计算。PostgreSQL (14) 仅支持stored 生成列。

限制说明

生成的列有许多限制。例如,生成表达式不能引用另一个生成的列。此外,它们只能使用不可变函数,不能以任何方式使用子查询或引用当前行以外的任何内容。具体包括:

  • 生成表达式只能使用不可变函数,不能以任何方式使用子查询或引用当前行以外的任何内容。
  • 生成表达式不能引用另一个生成的列。
  • 生成表达式不能引用系统列(表类除外)。
  • 生成的列不能有列默认值或标识定义。
  • 生成的列不能是分区键的一部分。
  • 外部表可以生成列

到此这篇关于PostgreSQL生成列实现过程介绍的文章就介绍到这了,更多相关PostgreSQL生成列内容请搜索程序员之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员之家!

您可能感兴趣的文章:

相关文章

  • 在Linux系统上安装PostgreSQL数据库

    在Linux系统上安装PostgreSQL数据库

    这篇文章介绍了在Linux系统上安装PostgreSQL数据库的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-03-03
  • PostgreSQL对数组元素聚合基本方法示例

    PostgreSQL对数组元素聚合基本方法示例

    这篇文章主要为大家介绍了PostgreSQL对数组元素聚合基本方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • PostgreSQL如何查询表大小(单独查询和批量查询)

    PostgreSQL如何查询表大小(单独查询和批量查询)

    PostgreSQL提供了多个系统管理函数来查看表,索引表空间及数据库的大小,这篇文章主要给大家介绍了关于PostgreSQL如何查询表大小的相关资料,文中介绍的方法包括单独查询和批量查询,需要的朋友可以参考下
    2024-02-02
  • Postgresql的select优化操作(快了200倍)

    Postgresql的select优化操作(快了200倍)

    这篇文章主要介绍了Postgresql的select优化操作(快了200倍),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • 初识PostgreSQL存储过程

    初识PostgreSQL存储过程

    这篇文章主要介绍了初识PostgreSQL存储过程,本文讲解了PostgreSQL中存储过程的语法,并给出了一个操作实例,需要的朋友可以参考下
    2015-01-01
  • PostgreSQL TIMESTAMP类型 时间戳操作

    PostgreSQL TIMESTAMP类型 时间戳操作

    这篇文章主要介绍了PostgreSQL TIMESTAMP类型 时间戳操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • postgresql的jsonb数据查询和修改的方法

    postgresql的jsonb数据查询和修改的方法

    这篇文章主要介绍了postgresql的jsonb数据查询和修改的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Mac OS上安装PostgreSQL的教程

    Mac OS上安装PostgreSQL的教程

    今天我们来看在Mac OS上安装PostgreSQL的教程,这里我们通过brew包管理器来安装,所以首先我们会讲解brew的安装配置:
    2016-06-06
  • PostgreSQL 远程连接配置操作

    PostgreSQL 远程连接配置操作

    这篇文章主要介绍了PostgreSQL 远程连接配置操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • PostgreSQL 流复制异步转同步的操作

    PostgreSQL 流复制异步转同步的操作

    这篇文章主要介绍了PostgreSQL 流复制异步转同步的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12

最新评论

?


http://www.vxiaotou.com