【问题标题】:Error 55000 `object_not_in_prerequisite_state` when trying to refresh a materialized view尝试刷新实体化视图时出现错误 55000 `object_not_in_prerequisite_state`
【发布时间】:2018-04-30 04:10:43
【问题描述】:

我正在尝试运行 REFRESH MATERIALIZED VIEW CONCURRENTLY recipe_search;,但 PostgreSQL 给了我这个错误:ERROR 55000 (object_not_in_prerequisite_state): cannot refresh materialized view "public.recipe_search" concurrently

有问题的物化视图在psql 中如下所示:

# \d recipe_search

   Materialized view "public.recipe_search"
  Column  |          Type          | Modifiers
----------+------------------------+-----------
 id       | integer                |
 title    | character varying(255) |
 document | tsvector               |
Indexes:
    "recipe_search_document_index" gin (document)
    "recipe_search_title_trgm_index" gin (title gin_trgm_ops)

为什么我不能同时刷新?

【问题讨论】:

  • 有人对此投了反对票。如果您对我回答自己的问题感到生气,请参阅stackoverflow.com/help/self-answer。当我遇到这个问题时,我在网上搜索了这个错误消息,但没有找到任何有用的信息。在我解决了这个问题之后,我来这里记录它,以便将来的搜索者可以找到它。这完全符合 StackOverflow 的使命。
  • 自答题是可以的,但自答题并不影响问题的质量。您的问题缺少重现问题所需的信息。除此之外,搜索错误消息会给我stackoverflow.com/questions/41803781/…,这看起来是一个骗局,并且那里的评论表明错误消息后面应该有一个提示,这在您的问题中不存在。 (不,我没有投票,至少现在还没有。在这里发布它的想法确实不错。)
  • @hvd 我没有看到提示,因为我正在通过触发器和数据库库运行REFRESH - 如果我直接通过 psql 尝试REFRESH,我确实看到了。我可能应该添加视图的\d;我已经相应地更新了这个问题。但我想要完成的主要事情是启用搜索此错误消息以找到解决方案。

标签: postgresql


【解决方案1】:

物化视图需要唯一索引

物化视图无法刷新CONCURRENTLY,除非它至少有一个唯一索引,如文档中所述:

同时

... 仅当物化视图上至少有一个 UNIQUE 索引且仅使用列名并包括所有行时,才允许使用此选项;也就是说,它不能索引任何表达式,也不能包含 WHERE 子句。

https://www.postgresql.org/docs/9.6/static/sql-refreshmaterializedview.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 2014-09-05
    • 1970-01-01
    • 2019-12-30
    • 1970-01-01
    • 2011-11-01
    • 2017-03-13
    相关资源
    最近更新 更多