刷新实例化视图不包括添加的列

时间:2013-09-22 20:28:23

标签: postgresql view materialized-views postgresql-9.3

来自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 | 

新专栏在哪里?这是预期的行为吗?如果是,那么我认为该手册具有误导性。

1 个答案:

答案 0 :(得分:4)

SELECT *在执行时展开,就像所有类似的操作一样(CREATE VIEWCREATE TABLE AS

关键词是“早期绑定”而不是“后期绑定”。 Postgres会保存执行时SELECT *的列列表,之后添加的列会自动包含 查询字符串本身不会保存,只会在展开SELECT *之后的内部表示以及解析所有标识符等其他内容。

REFRESH MATERIALIZED VIEW 从不更改数据定义,只更改数据:

  

REFRESH MATERIALIZED VIEW完全替换了物化视图的内容。

手册可能更明确,但comparison to the behavior of CREATE TABLE AS让我明白了:

  除了{p> CREATE MATERIALIZED VIEWCREATE TABLE AS类似   它还会记住用于初始化视图的查询。