【问题标题】:PostgreSQL, Prevent alter materialized view changing WITH NO DATA to WITH DATAPostgreSQL,防止更改物化视图将 WITH NO DATA 更​​改为 WITH DATA
【发布时间】:2018-09-19 20:36:39
【问题描述】:

我想在不丢失数据的情况下更改 PostgreSQL 10.1 物化视图的名称。刷新此物化视图需要 12 多个小时。

因此,为了测试 alter materialized view 语句,我在另一个定义中有 WITH NO DATA 子句的物化视图上进行了尝试。

当我运行命令时:

ALTER MATERIALIZED VIEW etl.mv_test
RENAME to etl.vw_test

WITH NO DATA 子句已更改为 WITH DATA。所以我认为视图将被刷新。是否可以在更改后的视图中保留 WITH NO DATA 子句?

【问题讨论】:

  • 重命名后仍然会抛出“未填充”错误(请参阅here),这可能意味着它尚未刷新。您说WITH NO DATA 子句已更改;你到底在哪里看?第三方管理工具(包括 pgAdmin)在重构 DDL 语句时往往会遗漏其中一些可选子句。除非它来自 pg_dumppsql,否则我不会相信它(即使那样,它也可能是一个错误)。
  • 我正在使用 PGAdmin。更改视图后,我打开 CREATE SCRIPT 并且 WITH NO DATA 已更改
  • 我猜这只是一个 pgAdmin 错误。您看到的 CREATE 语句并非来自 Postgres,pgAdmin 是通过检查目录表来构建它的,但它并不总是正确的。尝试将您的视图定义为SELECT 1/0;你会知道它什么时候被刷新,因为它会抛出一个被零除的错误。
  • 我认为你是对的!我尝试了 select 1/0 并在更改视图名称时没有抛出错误!现在将尝试使用带有数据的 MV,同时更改 MV 源中的数据。谢谢!

标签: postgresql materialized-views


【解决方案1】:

WITH [ NO ] DATA 仅适用于新创建的物化视图。您可以轻松忽略 PgAdmin 显示的内容,因为它与现有的无关。

the documentation:

有 [ 无 ] 数据

此子句指定物化视图是否应在创建时填充。如果没有,实体化视图将被标记为不可扫描,并且在使用 REFRESH MATERIALIZED VIEW 之前无法查询。

【讨论】:

  • 另外:该选项甚至没有与 mview 的定义一起存储:postgresql.org/docs/current/static/view-pg-matviews.html
  • @a_horse_with_no_name:不是在ispopulated列吗?
  • @NickBarnes - 不,ispopulated 显示当前是否填充了物化视图。 PgAdmin 显示选项WITH [ NO ] DATA,以防您要重新创建数据库/模式/视图。事实上,这可能有点误导。
  • @klin:ispopulated=false 不是暗示视图是使用WITH NO DATA 子句创建(或刷新)的吗?有没有其他方法可以达到这个状态?
  • @NickBarnes - 这不是了解视图是如何创建的方法,因为ispopulated 可能会在refresh 之后更改。
猜你喜欢
  • 2018-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 2021-03-25
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
相关资源
最近更新 更多