PostgreSQL 只支持 STORED 生成列吗? [复制]

2024-03-30

前言

我给出了一些 PHP 示例,只是为了指出我的开发环境。问题不在于 PHP,而纯粹在于 PostgreSQL。


PostgreSQL有关生成列的文档 https://www.postgresql.org/docs/12/ddl-generated-columns.html指出:

生成的列有两种:存储列和虚拟列。存储的生成列在写入(插入或更新)时进行计算,并像普通列一样占用存储空间。虚拟生成列不占用存储空间,并且在读取时进行计算。

然而,它仅显示了一个示例存储列在该页面的示例中,而不是虚拟页面。它还说:

必须指定关键字 STORED 来选择生成列的存储类型。有关更多详细信息,请参阅创建表。

...它链接到的地方创建表页面 https://www.postgresql.org/docs/12/sql-createtable.html。在该页面中,文档清楚地指出了模式是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_*全局模式)中entries桌子。我想计算do_hint即时运行,以便:

  • 我实际上可以从数据库中查询它。当然,我也可以在 PHP 上生成它,但我想查询,这就是我想使用虚拟列的点。
  • 我想依赖 PostgreSQL 而不是 PHP 的性能。

并考虑到stored列仅生成一次(当插入行时),这不是我想要的行为。我想要一个虚拟专栏,以便我可以即时阅读。

我的代码中出现语句错误。

  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部分是问题所在。所以我想“也许,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))

所以,我的问题就在标题中:Does PostgreSQL, at this point in time, only support存储的虚拟列?难道现在就没有办法获取虚拟列了吗?

我的意思是,当文档说“有两种生成的列:存储的列和虚拟的列”时,我感到很困惑。是否(i)只是想引入以下概念:virtual and 存储生成的列在这里或 (ii) 宣传 PostgreSQL 12 上的新功能?我的意思是,如果没有办法创建虚拟生成列,他们可以添加一条警告,指出“目前无法虚拟生成列。我们仅支持存储的列。”但文档中没有任何地方有这样的警告。我很困惑。

提前致谢。


环境

  • PHP 7.4.5
  • 拉拉维尔 7
  • PostgreSQL 12.2

The 文件明确指出 https://www.postgresql.org/docs/12/ddl-generated-columns.html不支持虚拟生成的列。

PostgreSQL 目前仅实现存储的生成列。

这仅出现在您引用的文档部分之后的一句话。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PostgreSQL 只支持 STORED 生成列吗? [复制] 的相关文章

随机推荐