Postgresql 覆盖现有postgis表时扭曲物化视图的问题
主要问题:根据PostgreSQL/PostGIS表,我有几个视图,以及通过查询其他视图创建的最终物化视图。我需要一个快速和可更新的最终结果(即MV)在QGIS项目中使用 我的目标是更新起始表,用新的(很多)值覆盖它,并希望有更新视图和物化视图。我使用QGIS DB管理器覆盖现有的表,但我得到一个错误,因为mv依赖于它。若我删除mv,覆盖表格,然后重新创建mv,一切正常,但我希望尽可能避免手动操作 有没有更好的方法来实现我的目标Postgresql 覆盖现有postgis表时扭曲物化视图的问题,postgresql,materialized-views,Postgresql,Materialized Views,主要问题:根据PostgreSQL/PostGIS表,我有几个视图,以及通过查询其他视图创建的最终物化视图。我需要一个快速和可更新的最终结果(即MV)在QGIS项目中使用 我的目标是更新起始表,用新的(很多)值覆盖它,并希望有更新视图和物化视图。我使用QGIS DB管理器覆盖现有的表,但我得到一个错误,因为mv依赖于它。若我删除mv,覆盖表格,然后重新创建mv,一切正常,但我希望尽可能避免手动操作 有没有更好的方法来实现我的目标 另一个问题:如果我在更新/插入/删除表中的值时设置了一个触发器来刷
另一个问题:如果我在更新/插入/删除表中的值时设置了一个触发器来刷新mv,那么即使用一个新的值覆盖整个表,它也会工作吗?刷新物化视图会运行完整的定义查询,因此对于复杂的查询来说,这是一个长时间运行且繁重的操作 可以从触发器启动
REFRESH MATERIALIZED VIEW
(最好是每个语句的
触发器),但这会使每次数据修改都非常缓慢,我认为这实际上是不可行的
一件可能有效的事情是实现像物化视图这样的东西,它可以“手动”立即刷新:
- 为“物化视图”创建一个常规表,并通过运行查询填充数据
- 在每个基础表上,定义一个行级触发器,根据触发它的更改修改物化视图
这应该适用于定义足够简单的视图,对于复杂的查询,这是不可能的。您是要更新物化视图,还是要更新基础表并根据这些修改更改物化视图?您的意图不清楚。我想无错误地更新(通过qgis db manager覆盖)基础表,然后刷新MV谢谢,但刷新MV不是我的主要目标。我想了解如何覆盖基础表,而不首先删除链接MV,也不在您说“覆盖”时出错,你是说
UPDATE
还是ALTER/DROP TABLE
?当你说“链接”MV时,你的意思是MV在其定义中使用了taböe吗?我使用了“覆盖”这个术语,因为它是Qgis DB Manager中使用的,但我认为它应该是一个更新或更改(我认为不会删除表)。是的,对于“链接”MV,我的意思是MV在其定义中使用表UPDATE
不会有问题,因此您必须使用ALTER table
或DROP table
。只要物化视图就位,这是不可能的。那就别那么做。