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