是否有一个 postgres 命令来列出/删除所有物化视图?

Posted

技术标签:

【中文标题】是否有一个 postgres 命令来列出/删除所有物化视图?【英文标题】:Is there a postgres command to list/drop all materialized views? 【发布时间】:2014-05-30 08:30:21 【问题描述】:

我在我的代码中创建了多个视图,每次运行代码时,我都想删除迄今为止生成的所有物化视图。是否有任何命令可以列出 Postgres 的所有物化视图或全部删除?

【问题讨论】:

【参考方案1】:

纯 SQL

全部显示:

SELECT oid::regclass::text
FROM   pg_class
WHERE  relkind = 'm';

根据您当前的search_path 在从regclasstext 的演员表中的需要,名称会自动被双引号和架构限定。

在系统目录中pg_class物化视图标记为relkind = 'm'。The manual:

m = materialized view

删除全部,您可以使用此查询生成所需的 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 中的元命令

在默认的交互终端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 中,上面的第三个列表应该开始:SELECT 'DROP MATERIALIZED VIEW' ... @MichaelTerry:是的,我把话题转移到了视图上。谢谢,已修复。 作为旁注,您可以使用 pg 快速命令 \dm 从 cli 客户端获取视图列表。【参考方案2】:

如果您想在每个视图前使用 DROP 语句获取完整列表,这会更容易:

SELECT 'DROP MATERIALIZED VIEW ' || relname || ';' 
FROM   pg_class
WHERE  relkind = 'm';

【讨论】:

【参考方案3】:

此答案基于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>>'

【讨论】:

以上是关于是否有一个 postgres 命令来列出/删除所有物化视图?的主要内容,如果未能解决你的问题,请参考以下文章

在一个命令中删除所有表而不删除 django dbshel​​l 中的 postgres 中的数据库?

linux rpm包的路径怎么找

是否有列出所有 Unix 组名的命令? [关闭]

在 postgres 中删除所有共享相同前缀的表

如何在 Postgres 中删除表的所有索引?

使用 SQL 列出 Postgres db 8.1 中的所有序列