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 Green2 | Aziz      | Ahmad    | Aziz Ahmad3 | Zohan     | Ahuja    | Zohan Ahuja4 | Homer     | Presley  | Homer Presley5 | Sally     | Smith    | Sally Smith

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

Stored vs Virtual

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

  • STORED (aka 持久化): 列值被存储在表里. 当写(插入或更新)时存储列被重新计算,并像普通列一样占用存储空间。

  • VIRTUAL: 虚拟生成列不占用存储空间,仅当读时才计算。PostgreSQL (14) 仅支持stored 生成列。

限制说明

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

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

如何创建PostgreSQL 生成列相关推荐

  1. PostgreSQL 生成列(Generated Columns)教程

    PostgreSQL 12 增加新的特性--生成列(Generated Columns),也就是计算列.在之前版本也可以实现,但需要定义函数和触发器,利用该功能可以更容易使用并可以提升性能. 生成列是 ...

  2. SQL 中的生成列/计算列以及主流数据库实现

    文章目录 什么是生成列? Oracle 中的虚拟列 MySQL 中的生成列 SQL Server 中的计算列 PostgreSQL 中的存储生成列 SQLite 中的生成列 什么是生成列? 在 SQL ...

  3. PostgreSQL SERIAL创建自增列

    PostgreSQL SERIAL创建自增列 本文我们介绍PostgreSQL SERIAL,并展示如何使用serial类型创建表自增列. PostgreSQL SERIAL伪类型 PostgreSQ ...

  4. mysql5.7 生成列 generated column

    生成列的值是根据列定义中的表达式计算得出的. mysql5.7支持两种类型的生成列: 1.virtual 生成列:当从表中读取记录时,才计算该列值.不会把数据持久化在硬盘上. 2.stored 生成列 ...

  5. (解题思路)Entity Framework 如动态创建表或者列

    1.数据库中建立关于表结构信息的视图.(这个完全可以做到) 2.根据视图信息动态生成(内存.文件)edmx信息,根据edmx信息动态生成ObjectContext内容. 3.动态编译edmx及Obje ...

  6. 宝剑赠英雄 - 任意字段\条件等效查询, 探探PostgreSQL多列展开式B树

    标签 PostgreSQL , 多列索引 , btree , gin , gist , brin , btree_gist , btree_gin , 复合索引 , composite index , ...

  7. linux postgresql 创建数据库,Linux下创建Postgresql数据库的方法步骤

    Linux下创建Postgresql数据库的方法步骤 前言 PostgreSQL (也叫 Postgres)是一个自由的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发行. ...

  8. pandas读取多个文件内容为dataframe、并合并为一个dataframe、pandas创建仅有列标签而内容为空的dataframe

    pandas读取多个文件内容为dataframe.并合并为一个dataframe.pandas创建仅有列标签而内容为空的dataframe 目录

  9. python和R对dataframe创建新的列或者改变列:dplyr、rename、map、mapvalues、astype、as.character、as.integer、as.numeric

    python和R对dataframe创建新的列或者改变列:dplyr.rename.map.mapvalues.astype.as.character.as.integer.as.numeric # ...

最新文章

  1. TIOBE 9 月编程语言排行榜发布,C++ 增速最快,C++20 的功劳?
  2. 怎样的视频监控的管理与运营才算高效
  3. mq 自动消费 php,php – 从RabbitMq消费不确认消息
  4. 29 个你必须知道的 Linux 命令
  5. Arnold+Shave 渲染毛发
  6. Android程序签名打包 什么是签名,有什么用:
  7. C++ Primer 5th笔记(chap 13 拷贝控制) 对象移动
  8. python 霍夫直线变换_OpenCV-Python 霍夫线变换 | 三十二
  9. 职中心得体会300字高一计算机,职业高中毕业的自我鉴定范文300字
  10. bash上的mysql在zsh用不了_Zsh和Bash的兼容性问题
  11. linux 文件查找
  12. 数学史思维导图_如何学好高中数学,看懂思维导图,秒懂系列之集合
  13. SPSS 市场细分:客户画像\客户价值模型
  14. 计算机程序设计c++ 10-2:析构函数
  15. Java注解(Annotation)
  16. linux fcitx改mac输入法,Linux安装fcitx输入法
  17. HEIF HEVC 你知道多少?
  18. MobileNet V2 模型分析+解读
  19. VS Code 知乎 Live,参与人数突破 1000 人!
  20. 我国风险投资体系的构建和相关政策研究

热门文章

  1. .jar是什么文件?(转载)
  2. python菜鸟学习Day9(requests,套接字socket)
  3. 智能智造技术理论 第二讲 智能制造定义与现状
  4. android串口通信——android-serialport-api
  5. 深圳免费旅游景点大全|深圳旅游攻略(上)
  6. 一文揭秘阿里、腾讯、百度的薪资职级
  7. JAVA中implements的用法
  8. linux中Swap分区是做什么的?
  9. 花了10分钟,终于弄懂了特征值和特征向量到底有什么意义
  10. Hutool XML 转JSON 后 parseArray踩坑