Postgresql 刷新物化视图不包括添加的列

Postgresql 刷新物化视图不包括添加的列,postgresql,view,materialized-views,postgresql-9.3,Postgresql,View,Materialized Views,Postgresql 9.3,从 创建物化视图类似于创建表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

创建物化视图类似于创建表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 | 

新专栏在哪里?这是预期的行为吗?如果是这样的话,我认为手册是误导性的。

SELECT*
在执行时会展开,就像所有类似的操作一样(,)

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

从不更改数据定义,仅更改数据:

刷新物化视图
完全替换物化视图的内容

手册可以更明确地说明这一点,但我清楚地看到:

CREATE MATERIALIZED VIEW
类似于
CREATE TABLE AS
,除了 它还记得用于初始化视图的查询


保存宏处理的查询很可能是正确的答案。但让你明白的短语正是让我感到困惑的短语:除了它还记得用于初始化view@ClodoaldoNeto当前位置在手册中明确说明这一点当然没有坏处。