sql - 是否有 postgres 命令来列出/删除所有物化 View ?

标签 sql postgresql ddl materialized-views drop

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

最佳答案

纯SQL

显示全部:

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

根据您当前的 search_path,在需要的地方,名称会自动被双引号和模式限定。在从 regclasstext 的转换中。

在系统目录 pg_class 中,物化 View 用 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语句可以处理多个物化 View 。如果您有嵌套 View ,您可能需要在末尾添加 CASCADE

在执行之前检查生成的 DDL 脚本以确保确定。您确定要从数据库中的所有模式中删除所有 MV 吗?您是否拥有这样做所需的权限? (目前在全新的标准安装中没有物化 View 。)

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;

关于sql - 是否有 postgres 命令来列出/删除所有物化 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23092983/

相关文章:

mysql - 优化缓慢的 mysql 查询

postgresql - 错误 : function to_jsonb(text, jsonb) 不存在 - POSTGRESQL

java - 用于 DDL 的 JPA/Hibernate

sql - Oracle 中的强制可编辑 View

sql - 如何在 PostgreSQL 中声明和使用变量?

nhibernate - 如何从 NHibernate 映射文件生成 "migration"DDL?

MySQL SELECT 查询包含位字段和字符串字段比较 NULL 返回空集

sql - NHibernate Linq 中前 5 个元素的总和

mysql - 如何删除mysql中的外键?

postgresql - 从连接日期和时间列中获取时间戳