创建视图会创建一个表

时间:2017-03-28 15:59:52

标签: ruby-on-rails postgresql

我的视图取决于物化视图。 我在.sql文件中有他们的定义,级联删除了物化视图。

DROP MATERIALIZED VIEW IF EXISTS mat_view_name CASCADE;

CREATE MATERIALIZED VIEW mat_view_name AS ...;

CREATE VIEW view_name AS
    SELECT ... FROM (
        SELECT ... FROM mat_view_name
        UNION
        SELECT ... from another_table
    )
;

我在物化视图中更改了一个SELECT语句,当我在迁移中执行sql脚本时,它将我的初始视图更改为我的structure.sql中的表。

这是我在structure.sql中获得的新代码

CREATE TABLE view_name (
    ...
);

ALTER TABLE ONLY view_name REPLICA IDENTITY NOTHING;

CREATE RULE "_RETURN" AS
ON SELECT TO view_name DO INSTEAD  SELECT .....;

如果我回滚迁移,我会收回原始代码:

CREATE VIEW view_name AS...

我只在物化视图中的select中添加了两个JOIN语句。

我的数据库版本是9.6.2。

你知道为什么会这样吗? 这是性能问题,PG决定使用它而不是经典视图吗? 如何强制它创建视图?

1 个答案:

答案 0 :(得分:0)

我假设您从转储或数据库备份中获取此脚本。

物化视图本质上是以与CREATE TABLE AS类似的方式创建的表,其中sql存储在数据库中,因此可以刷新它。

转储materialized view时的默认行为是转储为表。

CREATE MATERIALIZED VIEW: documentation