6

手册

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 | 

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

4

1 回答 1

5

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

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

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

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

该手册可能对此更加明确,但与 的行为的比较CREATE TABLE AS让我更清楚:

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

于 2013-09-24T02:09:25.097 回答