Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 覆盖现有postgis表时扭曲物化视图的问题_Postgresql_Materialized Views - Fatal编程技术网

Postgresql 覆盖现有postgis表时扭曲物化视图的问题

Postgresql 覆盖现有postgis表时扭曲物化视图的问题,postgresql,materialized-views,Postgresql,Materialized Views,主要问题:根据PostgreSQL/PostGIS表,我有几个视图,以及通过查询其他视图创建的最终物化视图。我需要一个快速和可更新的最终结果(即MV)在QGIS项目中使用 我的目标是更新起始表,用新的(很多)值覆盖它,并希望有更新视图和物化视图。我使用QGIS DB管理器覆盖现有的表,但我得到一个错误,因为mv依赖于它。若我删除mv,覆盖表格,然后重新创建mv,一切正常,但我希望尽可能避免手动操作 有没有更好的方法来实现我的目标 另一个问题:如果我在更新/插入/删除表中的值时设置了一个触发器来刷

主要问题:根据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
。只要物化视图就位,这是不可能的。那就别那么做。