来自manual
CREATE MATERIALIZED VIEW类似于CREATE TABLE AS,不同之处在于它还会记住用于初始化视图的查询,以便以后可以根据需要刷新。
据我所知,刷新实体化视图应该与re create view as
具有相同的效果。但这不是这里发生的事情。
创建一个包含单列的表
drop table if exists t cascade;
create table t (a int);
insert into t (a) values (1);
创建物化视图
create materialized view mat_view_t as
select * from t ;
select * from mat_view_t;
a
---
1
现在将一个列添加到源表
alter table t add column b int;
\d t
Table "public.t"
Column | Type | Modifiers
--------+---------+-----------
a | integer |
b | integer |
然后刷新物化视图
refresh materialized view mat_view_t;
select * from mat_view_t;
a
---
1
\d mat_view_t
Materialized view "public.mat_view_t"
Column | Type | Modifiers
--------+---------+-----------
a | integer |
新专栏在哪里?这是预期的行为吗?如果是,那么我认为该手册具有误导性。
答案 0 :(得分:4)
SELECT *
在执行时展开,就像所有类似的操作一样(CREATE VIEW
,CREATE TABLE AS
)
关键词是“早期绑定”而不是“后期绑定”。 Postgres会保存执行时SELECT *
的列列表,之后添加的列会自动包含 。 查询字符串本身不会保存,只会在展开SELECT *
之后的内部表示以及解析所有标识符等其他内容。
REFRESH MATERIALIZED VIEW
从不更改数据定义,只更改数据:
REFRESH MATERIALIZED VIEW
完全替换了物化视图的内容。
手册可能更明确,但comparison to the behavior of CREATE TABLE AS
让我明白了:
除了{p>CREATE MATERIALIZED VIEW
与CREATE TABLE AS
类似 它还会记住用于初始化视图的查询。