sql - PostgreSQL 是否只支持 STORED 生成的列?
问题描述
前言
我已经给出了一些 PHP 的例子来说明我的开发环境。问题不在于 PHP,而纯粹是关于 PostgreSQL。
关于生成列的PostgreSQL文档指出:
生成的列有两种:存储列和虚拟列。存储生成的列在写入(插入或更新)时计算,并像普通列一样占用存储空间。虚拟生成的列不占用存储空间,在读取时计算。
但是,它仅在该页面的示例中显示了存储列的示例,而不是虚拟的。它还说:
必须指定关键字 STORED 以选择生成列的存储类型。有关详细信息,请参阅创建表。
...它链接到CREATE TABLE 页面。在该页面中,文档清楚地指出了模式是GENERATED ALWAYS AS (expression) STORED
.
生成始终为 ( generation_expr ) 存储
此子句将该列创建为生成的列。该列无法写入,读取时将返回指定表达式的结果。
需要关键字 STORED 来表示该列将在写入时计算并将存储在磁盘上。
生成表达式可以引用表中的其他列,但不能引用其他生成的列。使用的任何函数和运算符都必须是不可变的。不允许引用其他表。
我实际上尝试在 Laravel (PHP) 中实现一个虚拟字段,这是我迄今为止在迁移中提出的:
DB::statement('ALTER TABLE entries ADD COLUMN do_hint BOOLEAN GENERATED ALWAYS AS (hint_hash OR hint_tags OR hint_due_date OR hint_created_at OR hint_updated_at) VIRTUAL');
正如您在此语句中看到的,表中有hint_hash
,hint_tags
和其他几个布尔列(以hint_*
glob 模式命名)entries
。我想do_hint
即时计算,以便:
- 我实际上可以从数据库中查询它。当然,我也可以在 PHP 上生成它,但我想查询,这就是我想使用虚拟列的原因。
- 我想依靠 PostgreSQL 而不是 PHP 的性能。
并且考虑到存储的列只生成一次(插入行时),这不是我想要的行为。我想要一个虚拟专栏,以便我可以即时阅读。
我从我的代码中得到语句错误。
SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "VIRTUAL"
LINE 1: ...hint_due_date OR hint_created_at OR hint_updated_at) VIRTUAL
^ (SQL: ALTER TABLE entries ADD COLUMN do_hint BOOLEAN GENERATED ALWAYS AS (hint_hash OR hint_tags OR hint_due_date OR hint_created_at OR hint_updated_at) VIRTUAL)
它VIRTUAL
部分地指出了问题所在。所以我想“也许,虚拟生成的列是默认行为。” 所以我删除它并再次尝试,但它再次失败,抱怨必须定义生成列的类型:
SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at end of input
LINE 1: ...tags OR hint_due_date OR hint_created_at OR hint_updated_at)
^ (SQL: ALTER TABLE entries ADD COLUMN do_hint BOOLEAN GENERATED ALWAYS AS (hint_hash OR hint_tags OR hint_due_date OR hint_created_at OR hint_updated_at))
所以,我的问题就在标题中:PostgreSQL 在这个时间点是否只支持存储的虚拟列?此时有没有办法获得虚拟列?
我的意思是,当文档说“有两种生成的列:存储的和虚拟的。”时,我感到很困惑。是 (i) 只是试图在此处引入虚拟和存储生成列的概念,还是 (ii) 宣传它在 PostgreSQL 12 上具有的新功能?我的意思是,如果没有办法创建虚拟生成的列,他们可以添加一条警告说“此时虚拟生成的列是不可能的。我们只支持存储的列”。但是文档中的任何地方都没有这样的警告。我很困惑。
提前致谢。
环境
- PHP 7.4.5
- 拉拉维尔 7
- PostgreSQL 12.2
解决方案
推荐阅读
- python - 在 python 中使用多处理运行多个 ML 模型
- html - 在移动设备上拖动图表时,Angular highcharts 滚动不起作用
- javascript - 如何使用正则表达式拆分这两个字符串?
- javascript - 使用 Javascript 获取唯一的 XML 子节点
- forms - 在颤振中验证表单字段
- html - 错误 错误:找不到类型为“object”Angular 的不同支持对象“[object Object]”
- arrays - 将列数组转换为行对象数组
- python - 如何在 Python Neo4J 中使用字典参数
- c++ - 向量指针上的 Sysmalloc 错误
在第二次推回 - docker - gitlab 中的基本 ci 实现错误致命:找不到远程参考