Подход 1: Ручной метод копирования / вставки
Поскольку материализованное представление и представление являются различными объектами в вашей базе данных, вам необходимо удалить материализованное представление и создать представление на основе вашего материализованного представления.
Вы можете показать оператор SELECT
из своего материализованного представления двумя способами:
Способ 1: Используя директиву
\d+ viewname
Способ 2: Выполните SELECT
для внутренних таблиц
SELECT definition FROM pg_matviews WHERE matviewname='viewname';
Обе команды, перечисленные выше, покажут SELECT
, использованное в вашем материализованном представлении, поэтому вы можете скопировать в текстовый редактор, чтобы вставить before.
Следующий шаг - DROP
материализованное представление и создание нового просто как:
DROP MATERIALIZED VIEW viewname;
Последний шаг - завершение представления:
CREATE VIEW viewname AS <paste your SELECT statement here>
И, вуаля. Это делается вручную
Подход 2. Автоматический переход от matview к просмотру с помощью функции
Другой вариант, который мы можем использовать, если вы не можете копировать / вставлять, - это создать функция для преобразования данных. следующим образом:
CREATE TABLE mytable (id int, name varchar);
INSERT INTO mytable (1, 'John');
INSERT INTO mytable (2, 'Mary');
Создано над mytable в качестве примера
CREATE MATERIALIZED VIEW mymatview1 AS SELECT * FROM mytable;
Создано материализованное представление на основе mytable.
CREATE OR REPLACE FUNCTION frommaviewttoview(VARCHAR)
RETURNS VOID as $$
DECLARE
mymatview ALIAS FOR $1;
tomatview VARCHAR;
BEGIN
SELECT definition INTO tomatview
FROM pg_matviews
WHERE matviewname=$1;
EXECUTE 'DROP MATERIALIZED VIEW '||mymatview;
EXECUTE 'CREATE VIEW '||mymatview||' AS '||tomatview;
END;
$$ LANGUAGE plpgsql;
Создана функция для преобразования материализованное представление для просмотра
\d
И, с помощью \d
мы можем видеть материализованную информацию представления, как показано на рисунке ниже, извлеченную из моих тестов.
Эта функция получает определение и выполняет DROP MATERIALIZED VIEW
и CREATE MATERIALIZED VIEW
с определением SELECT
исходного материализованного представления.
Итак, вам нужно больше контролировать, если вы проиндексировали материализованные представления, поэтому, если какие-либо ссылочные блоки, ваше материализованное представление, вероятно, не будет исключено, и необходимо будет выполнить дополнительные элементы управления.