当前位置: 首页 > news >正文

PostgreSQL 18新特性之虚拟生成列

PostgreSQL 12 提供了生成列(GENERATED ALWAYS AS STORED)功能,但是只能支持存储型的生成列,需要占用存储空间,更新成本高。

为此,PostgreSQL 18 即将引入一个新的增强:虚拟生成列。这种类型的字段值不需要存储,而是在读取数据时进行计算。虚拟生成列类似于视图,而存储生成列更像物化视图。

我们可以通过在CREATE TABLE或者ALTER TABLE语句中指定字段的GENERATED ALWAYS AS约束来创建一个生成列:

column_name data_type 
GENERATED ALWAYS AS ( generation_expr ) [ STORED | VIRTUAL ]

其中,GENERATED ALWAYS AS表示创建生成列;generation_expr 指定了生成列的表达式;STORED表示存储生成列,VIRTUAL代表虚拟生成列(默认值)。

例如以下语句:

CREATE TABLE t_circle(
   id INTEGER PRIMARY KEY,
   x NUMERIC NOT NULL,
   y NUMERIC NOT NULL,
   radius NUMERIC NOT NULL,
   perimeter NUMERIC GENERATED ALWAYS AS (2 * 3.14159265 * radius) VIRTUAL
);

ALTER TABLE t_circle ADD area NUMERIC GENERATED ALWAYS AS (3.14159265 * radius * radius) VIRTUAL;

首先,CREATE TABLE语句为表 t_circle 定义了一个生成列 perimeter,表示圆的周长。然后,使用ALTER TABLE语句增加一个生成列 area ,表示圆的面积。

接下来我们插入一些数据:

INSERT INTO t_circle VALUES (1, 2, 2, 5);
SELECT * FROM t_circle;
id|x|y|radius|perimeter  |area       |
--|-|-|------|-----------|-----------|
 1|2|2|     5|31.41592650|78.53981625|

INSERT INTO t_circle(id, x, y, radius ,perimeter) VALUES (2, 0, 0, 1, 6.28318530);
SQL Error [42601]: ERROR: cannot insert into column "perimeter"
  Detail: Column "perimeter" is a generated column.

第一个插入语句没有指定生成列的值,由数据库自动计算;第二个插入语句为 perimeter 提供了数据,执行失败;INSERTUPDATE语句不能为生成列指定值。

虚拟生成列具有查询时实时计算,不占用存储空间等优点;但是目前 PostgreSQL 18 提供的虚拟生成列还存在一些限制:

  • 不支持索引,包括唯一约束;
  • 不支持扩展统计信息;
  • 不支持外键约束;
  • 不支持非空约束(可以使用检查约束);
  • 不支持 ALTER TABLE / DROP EXPRESSION 语句;
  • 不支持域类型;
  • 不支持逻辑复制。

相关文章:

  • Selenium/Playwright/Cypress对比与选型指南
  • 什么是vue的keep-alive?它是如何实现的?具体缓存了什么内容?
  • Qt从入门到入土(八) -打包Qt程序
  • 通义万相 2.1 × 蓝耘智算:AIGC 界的「黄金搭档」如何重塑创作未来?
  • 18天 - 常见的 HTTP 状态码有哪些?HTTP 请求包含哪些内容,请求头和请求体有哪些类型?HTTP 中 GET 和 POST 的区别是什么?
  • 刷题统计 | 第十三届蓝桥杯省赛C++B组
  • AI写论文提示词指令大全,快速写论文
  • 数据库学习笔记
  • 系统架构设计师-第5章 计算机网络
  • 我们在开发时,什么时候用到虚函数和纯虚函数?
  • 修复ubuntu下找不到音频设备的问题
  • Docker开发工具安装大合集
  • 如何撰写专业技术书籍的序言?——完整指南
  • FreeRTOS概述
  • SpringBoot 接入 豆包 火山方舟大模型
  • 共享内存的原理和创建
  • #函数探幽
  • 《深度解析DeepSeek-M8:量子经典融合,重塑计算能效格局》
  • Zemax 中的 CAD 文件性能比较
  • LeetCode hot 100—爬楼梯
  • 中国一重集团有限公司副总经理陆文俊被查
  • 顾家家居:拟定增募资近20亿元,用于家居产品生产线的改造和扩建等
  • 绍兴柯桥:用一块布托起中国制造的新经纬
  • 太空摄影的发展
  • 观察|印巴交火开始升级,是否会升级为第四次印巴战争?
  • 印巴局势快速升级,外交部:呼吁印巴以和平稳定的大局为重