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)
抱歉,这个例子有点奇怪。
唯一的方法是通过无操作更新重写整个表,例如:
UPDATE people SET first_name = first_name;
Run Code Online (Sandbox Code Playgroud)
这将重新评估该功能。
VACUUM (FULL)
之后您可能想在桌子上跑步以回收浪费的空间。