PostgreSQL 是否支持生成的列?也称为虚拟列。我不是在谈论IDENTITY
专栏。
我找不到关于这个非凡特性的任何信息,但我知道它可以在 SQL Server 以及最新版本的 MariaDB 和 MySQL 中使用。
SQL:2003标准中提到了该功能,并且在 2006 年左右在 PostgreSQL 论坛上进行了一些讨论,但我找不到任何实质性的内容。
有一些关于 SO 的讨论,但它现在已经很老了,所以它很可能已经过时了。
PostgreSQL 是否支持生成的列?也称为虚拟列。我不是在谈论IDENTITY
专栏。
我找不到关于这个非凡特性的任何信息,但我知道它可以在 SQL Server 以及最新版本的 MariaDB 和 MySQL 中使用。
SQL:2003标准中提到了该功能,并且在 2006 年左右在 PostgreSQL 论坛上进行了一些讨论,但我找不到任何实质性的内容。
有一些关于 SO 的讨论,但它现在已经很老了,所以它很可能已经过时了。
不确定这是否是您想要的,但属性表示法
row.full_name
和函数表示法full_name(row)
在 postgresql 中是等价的。这意味着你需要一张桌子
和一个功能:
并这样称呼它:
那是你需要的吗?
为了加快速度,您可以创建一个表达式索引:
或者将所有内容存储在物化视图中。
示例取自这里:http ://bernardoamc.github.io/sql/2015/05/11/postgres-virtual-columns/
是的:
GENERATED ALWAYS AS … STORED
如SQL:2003标准中所述,Postgres 12添加了生成列的功能。
该值在
INSERT
or时生成UPDATE
,然后像任何其他值一样与行一起存储。生成的必须基于同一个表的基列,或者基于不可变函数。
语法很简单,一个关于 的子句
CREATE TABLE
:例子:
特征:
注意事项:
看:
不,目前(从 Postgres 9.6 开始)不支持此功能。
唯一的解决方法是使用触发器或视图,如果它是一个不需要索引的简单计算。
根据您的用例,您可以通过声明一个新列并使用插入/更新触发器填充它来实现这种行为。
如果可能的话,我会使用上面的答案来避免重复可以从你已经拥有的数据中导出的数据,但它确实可以解决问题,并且对于你想要计算一次并保存的计算密集型导出字段很有用。
我考虑使用这种方法来处理一个问题,即我有时只有 18 位密钥的 15 位数字(最后 3 位数字只是一个校验和),但希望能够强制执行外键关系。
关于触发器的 PG 文档: https ://www.postgresql.org/docs/9.6/sql-createtrigger.html
W3 示例: https ://www.w3resource.com/PostgreSQL/postgresql-triggers.php