sql - Postgres : Replace a view that has dependencies

标签 sql postgresql view ddl

我还没有找到一个优雅的解决方案,所以我想知道是否有其他人偶然发现了类似的东西。

在 Postgres 中,我有一个 View MyViewAMyViewB 使用,而 MyViewC 使用。作为性能改进,我想具体化 View A,但我无法找到一种简单的方法来执行此操作而不删除并重新定义整个依赖项序列。

也就是说,理想情况下,我想这样做:

REPLACE MATERIALIZED VIEW MyViewA AS SELECT...

但不幸的是,Postgres 不允许在同一上下文中使用 REPLACEMATERIALIZED。我尝试了 DROP VIEW 然后 CREATE MATERIALIZED VIEW,但这当然会导致 Postgres 提示它不能删除 View MyViewA 因为其他对象依赖于它

有什么建议吗?

最佳答案

一种方法是创建一个临时 View ,修改 MyViewB 以使用它,重新定义原始 View 并将 MyViewB 修改回原始 View ,或者如果有不查询MyViewA,只需重命名它,定义一个新的并更改MyViewB

所以假设原文是(非常简化):

CREATE VIEW MyViewA AS SELECT col1, col2, col3 FROM table;
CREATE VIEW MyViewB AS SELECT col1, col2 FROM MyViewA where col3=1;
CREATE VIEW MyViewC AS SELECT col1 FROM MyViewB where col2='test';

然后你可以像这样修改MyViewA:

ALTER VIEW MyViewA RENAME TO MyViewTmp;
CREATE OR REPLACE VIEW MyViewB AS SELECT col1, col2 FROM MyViewTmp where col3=1;
CREATE MATERIALIZED VIEW MyViewA AS SELECT col1, col2, col3 FROM table;
CREATE OR REPLACE VIEW MyViewB AS SELECT col1, col2 FROM MyViewA where col3=1;
DROP VIEW MyViewTmp;

这样您就不需要处理任何依赖 View 。

关于sql - Postgres : Replace a view that has dependencies,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30335407/

相关文章:

mysql - 分配给用户 ID 的主键字段也应该是唯一的还是多余的?

java - Postgresql 使用 java 带密码备份和恢复

SQL来自一个分组的两个条件

android - 如何在 Android 中绘制一个形状作为其他布局对象之一?

javascript - Angular Controller 中的函数不将数据返回到 $scope 变量

mysql - 设计MySQL数据库

sql - 如何在 PostgreSQL 中创建一个显示 "occurrence number"一天的伪列?

sql - 按位置和顺序对复杂的聚合属性进行 Sequelize

mysql - 在 Mac 上并行使用 Postgre 和 MySQL

ios - 我如何普遍引用 self.view?