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

2023-12-30

来自manual http://www.postgresql.org/docs/9.3/static/sql-creatematerializedview.html

CREATE MATERIALIZED VIEW 与 CREATE TABLE AS 类似,不同之处在于它还记住用于初始化视图的查询,以便稍后可以根据需要刷新它。

据我了解,刷新物化视图应该与重新刷新具有相同的效果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 | 

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


SELECT *在执行时扩展,就像所有类似的操作一样(CREATE VIEW http://www.postgresql.org/docs/current/interactive/sql-createview.html, CREATE TABLE AS http://www.postgresql.org/docs/current/interactive/sql-createtableas.html)

关键词是“早期绑定”,而不是“后期绑定”。 Postgres 保存执行时存在的列列表SELECT *,后面添加的列是not自动包含在内。这请求参数本身不被保存,仅保存内部表示after扩大SELECT *以及其他诸如解析所有标识符之类的东西。

REFRESH MATERIALIZED VIEW http://www.postgresql.org/docs/current/interactive/sql-refreshmaterializedview.html never更改数据定义,仅更改数据:

REFRESH MATERIALIZED VIEW完全取代了物化视图的内容。

手册可能会更明确地说明这一点,但是与 的行为比较CREATE TABLE AS http://www.postgresql.org/docs/current/interactive/sql-creatematerializedview.html向我明确表示:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

刷新物化视图不包括添加的列 的相关文章

随机推荐