我在代码中创建多个视图,每次运行代码时,我想删除迄今为止生成的所有物化视图。是否有任何命令可以列出 Postgres 的所有物化视图或删除所有它们?
显示全部:
SELECT oid::regclass::text
FROM pg_class
WHERE relkind = 'm';
根据您当前从 search_path
到
regclass
的转换中的 text
,名称会在需要时自动用双引号引起来并进行模式限定。
在系统目录中
pg_class
物化视图带有 relkind = 'm'
标记。m = materialized view
要drop全部,您可以使用此查询生成所需的SQL脚本:
SELECT 'DROP MATERIALIZED VIEW ' || string_agg(oid::regclass::text, ', ')
FROM pg_class
WHERE relkind = 'm';
退货:
DROP MATERIALIZED VIEW mv1, some_schema_not_in_search_path.mv2, ...
DROP MATERIALIZED VIEW
语句可以处理多个物化视图。如果您有嵌套视图,您可能需要在末尾添加 CASCADE
。
在执行之前检查生成的 DDL 脚本以确保其正确。您确定要从数据库中的所有模式中删除all MV 吗?您是否拥有这样做所需的权限? (目前新的标准安装中没有物化视图。)
在默认的交互终端
psql
中,可以使用元命令:
\dm
在服务器上执行此查询:
SELECT n.nspname as "Schema",
c.relname as "Name",
CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'm' THEN 'materialized view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' WHEN 'f' THEN 'foreign table' WHEN 'p' THEN 'partitioned table' WHEN 'I' THEN 'partitioned index' END as "Type",
pg_catalog.pg_get_userbyid(c.relowner) as "Owner"
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('m','')
AND n.nspname <> 'pg_catalog'
AND n.nspname <> 'information_schema'
AND n.nspname !~ '^pg_toast'
AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1,2;
可以简化为:
SELECT n.nspname as "Schema"
, c.relname as "Name"
, pg_catalog.pg_get_userbyid(c.relowner) as "Owner"
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind = 'm'
AND n.nspname <> 'pg_catalog'
AND n.nspname <> 'information_schema'
AND n.nspname !~ '^pg_toast'
AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1,2;
您还可以使用
pg_matviews
系统视图列出所有物化视图。如果物化视图已填充或为空(ispopulated
列),此视图将为您提供包括物化视图定义在内的信息
select *
from pg_matviews
where matviewname = 'my_materialized_view';
此答案基于 Erwin Brandstetter 的答案。下面的版本添加了特定的模式名称,以便仅从定义的模式中检索物化视图。 Cascasde 还删除了对该模式中的物化视图的依赖。小心一点。
SELECT 'DROP MATERIALIZED VIEW <<schema_name>>.' || c.relname::text || ' CASCADE;' AS drop_statements
FROM pg_class c
INNER JOIN pg_namespace n ON n.oid = c.relnamespace
AND c.relkind = 'm'
AND n.nspname = '<<schema_name>>'
如果您想获得每个视图前面带有 DROP 语句的完整列表,这会更容易:
SELECT 'DROP MATERIALIZED VIEW ' || relname || ';'
FROM pg_class
WHERE relkind = 'm';