刷新 Postgres 中存储的生成列

jam*_*one 3 postgresql computed-column

在 PostgreSQL 中如何刷新存储的生成列的值。

例子

CREATE TABLE people (
    first_name TEXT,
    last_name TEXT


);

CREATE OR REPLACE FUNCTION name(people) RETURNS text AS
$$
SELECT $1.first_name || ' ' || $1.last_name
$$ LANGUAGE SQL STRICT
                IMMUTABLE
        ;

alter table people add column   full_name text GENERATED ALWAYS AS (name(people)) STORED;

insert into people(first_name, last_name) values('John', 'Smith');

select full_name, full_name='John Smith' as pass from people;
Run Code Online (Sandbox Code Playgroud)

如果需要更改用于生成存储列值的函数,在这种情况下name如何要求 postgres 重新计算这些字段。

例如。


CREATE OR REPLACE FUNCTION name(people) RETURNS text AS
$$
SELECT $1.first_name || ' ' || $1.last_name  ||  ' function change'
$$ LANGUAGE SQL STRICT
                IMMUTABLE
        ;


 -- refresh generated column here

select full_name, full_name='John Smith function change' as pass from people;

Run Code Online (Sandbox Code Playgroud)

抱歉,这个例子有点奇怪。

小提琴

Lau*_*lbe 6

唯一的方法是通过无操作更新重写整个表,例如:

UPDATE people SET first_name = first_name;
Run Code Online (Sandbox Code Playgroud)

这将重新评估该功能。

VACUUM (FULL)之后您可能想在桌子上跑步以回收浪费的空间。