我在我的代码中创建了多个视图,每次代码运行时,我都希望删除迄今为止生成的所有materialized 视图.是否有任何命令将列出Postgres的所有materialized 视图或删除所有这些视图?

推荐答案

纯SQL

全部显示:

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

在从regclasstext的强制转换中,根据您当前的search_path,名称在需要的地方会自动用双引号引起来并进行架构限定.

In the system catalog pg_class materialized views are tagged with relkind = 'm'.
The manual:

m = materialized view

对于drop all,您可以使用以下查询生成所需的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;

Database相关问答推荐

Pocketbase 中的 SQLite 数据库可以根据自己的喜好进行修改吗?

如何在没有sqlmock的情况下模拟db ping

将一个表中的多个列连接到另一个表中的单个列

术语 SSTable 和 LSM Tree 有什么区别

如何手动卸载 Oracle?

数据库模式 - location

如何将开发数据库更改移动到生产数据库?

数据验证是否应该在数据库级别进行?

操作错误:FATAL: database "django" does not exist

在一次 SQL 查询中更新多行的多列

用于存储年份的 MySQL 类型:Smallint 或 Varchar 或 Date?

如何禁用 Django 查询缓存?

数据库设计:喜欢表?

EF4 代码优先导致 InvalidOperationException

如何在android中使用合同类?

数据库与平面文本文件:当性能不是问题时, Select 一个而不是另一个的一些技术原因是什么?

Spring data : CrudRepository 的保存方法和更新

以可能的数据丢失为代价提高 PostgreSQL 写入速度?

与内连接相反

我将如何为读写操作实现单独的数据库?