如何获取 PostgreSQL 中表上所有索引的列名列表?

2024-06-04

我有这个查询来获取表上的索引列表:

SELECT
    ns.nspname as schema_name,
    tab.relname as table_name,
    cls.relname as index_name,
    am.amname as index_type,
    idx.indisprimary as is_primary,
    idx.indisunique as is_unique
FROM
    pg_index idx
INNER JOIN pg_class cls ON cls.oid=idx.indexrelid
INNER JOIN pg_class tab ON tab.oid=idx.indrelid
INNER JOIN pg_am am ON am.oid=cls.relam
INNER JOIN pg_namespace ns on ns.oid=tab.relnamespace
WHERE ns.nspname = @Schema AND tab.relname = @Name

它似乎工作正常。但现在我需要查询列列表,并且我无法理解系统视图的工作原理。

具体来说,我正在寻找的是:

  • [用于匹配第一个查询的索引名称或id]
  • 索引中的顺序
  • 栏目名称
  • 上升或下降
  • 排序列或包含列

理想情况下,我希望一次获取给定表的所有索引的上述项目。


请注意,我要查找的不仅仅是列名称。


使用系统目录信息功能pg_get_indexdef(index_oid) https://www.postgresql.org/docs/current/functions-info.html#FUNCTIONS-INFO-CATALOG-TABLE获取完整信息(包括索引表达式列表) - 在查询中pg_index https://www.postgresql.org/docs/current/catalog-pg-index.html获取给定表的所有索引:

SELECT pg_get_indexdef(indexrelid) || ';' AS idx
FROM   pg_index
WHERE  indrelid = 'public.tbl'::regclass;  -- optionally schema-qualified

Related:

  • Django/PostgreSQL varchar 到 UUID https://stackoverflow.com/questions/35139818/django-postgresql-varchar-to-uuid/35142957#35142957
  • 将索引从一个表复制到另一个表 https://dba.stackexchange.com/a/120194/3684

如果您依赖于非限定表名(没有模式),那么您依赖于当前search_path设置,并且可能会获取不同架构中同名表的结果。

或者,您可以加入pg_attribute手动获取各个列,如这些相关答案中所示:

  • 如何使用PostgreSQL从表名获取列属性查询? https://stackoverflow.com/questions/15928118/how-to-get-column-attributes-query-from-table-name-using-postgresql/15931552#15931552
  • 查找同一列上有多个索引的表 https://dba.stackexchange.com/a/204733/3684

关键要素是像这样加入:

FROM   pg_index idx
LEFT   JOIN pg_attribute a ON a.attrelid = idx.indrelid
                          AND a.attnum = ANY(idx.indkey)
                          AND a.attnum > 0

该手册关于pg_index.indkey:

这是一个数组indnatts指示哪些表列的值 该指数的索引。例如,值为1 3就意味着 第一和第三表列组成索引条目。钥匙 列位于非关键(包含)列之前。该数组中有一个零 表示对应的索引属性是一个表达式 表列,而不是简单的列引用。

Adding AND a.attnum > 0技术上没有必要,因为没有a.attnum = 0。但它使查询更清晰,而且不会有什么坏处。手册: https://www.postgresql.org/docs/current/catalog-pg-attribute.html

普通列从 1 开始编号。系统列(例如 oid)具有(任意)负数。

请注意,那里有“列名称列表”实际上也可以包含表达式。从 Postgres 11 开始,还有“包含”列(那里没有表达式)。pg_get_indexdef()开箱即用地处理所有可能的复杂情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获取 PostgreSQL 中表上所有索引的列名列表? 的相关文章

  • PostgreSQL 上的可扩展性

    我创建了自己的 R 树 rtree h 我想用我自己的数据结构 使用 PostGis 在 postgres 中创建一个扩展 我已经读过连接索引扩展 http www postgresql org docs 9 4 static xindex
  • 如何将线串分割成单独的线段?

    我是 PostGIS 新手 我有一组 数千个 线串和沿线关联的多个点 我想将每条线分成一组仅由 2 个点组成的线段 我找到了一些答案 但没有一个是我想要的答案 例如https gis stackexchange com questions
  • 为什么 PostgreSQL 中的聚合函数不适用于布尔数据类型

    为什么我们不能在聚合函数中使用布尔值而不先转换为某种整数类型 在许多情况下 从布尔数据类型的列计算总和 平均值或相关性是非常有意义的 考虑以下示例 其中布尔输入必须始终转换为int为了使其发挥作用 select sum boolinput
  • Postgresql - 如何获取表中与另一个表不匹配的条目

    我有一个问题 但我真的不知道如何问 请多多包涵 SELECT sc scd siteid scd desc frontend FROM shipping code sc LEFT OUTER JOIN shipping code descr
  • JDBC 驱动程序的版本和数据库的版本必须完全匹配吗?

    假设我在服务器上运行 postgresql 9 1 但我选择使用 9 2 驱动程序来访问它 这行得通吗 如果不是 这些版本检查是否始终强制执行 或者是否取决于您的 DBMS 不是强制性的 驱动程序可以支持多个版本的 RDBMS 或者仅支持特
  • 将 SQL 转储导入 PostgreSQL 数据库

    我们正在切换主机 旧主机提供了我们站点 PostgreSQL 数据库的 SQL 转储 现在 我尝试在本地 WAMP 服务器上进行设置来测试这一点 唯一的问题是我不知道如何在我设置的 PostgreSQL 9 中导入这个数据库 我尝试了 pg
  • 如何从动态查询中插入具有多列的表?

    如同上一个问题 https stackoverflow com questions 34194889 how to insert into table from dynamic query对于一对一映射 我需要一个针对源和目标中的多个列的解
  • rspec 返回“PG::Error: ERROR: 关系“table_name”不存在”

    rvm rspec 2 8 0 rails 3 0 6 和 pg 0 13 2 上的环境为 REE 2011 12 在 CentOS 5 6 上使用 PostgreSQL 8 3 17 db migrate 可以正常工作 但 rspec 出
  • 当 SQL 包含变量时在 pgAdmin 中调试 SQL

    在 SQL Server 中 我可以从应用程序中复制 sql 代码并将其粘贴到 SSMS 中 声明并分配 sql 中存在的变量并运行 是的 很棒的调试场景 例如 请注意 我很生疏 语法可能不正确 declare x as varchar 1
  • 减少 plpgsql 中烦人的通知

    我有一个使用临时表的函数 如果存在则必须将其删除 drop table if exists t xy create temp table t xy on commit drop as select 随后我在视图中使用这个函数 当 selec
  • Postgres 9.3 JSON 输出多维对象

    鉴于此查询 SELECT id as id attributes gt gt name as file name status from workflow events where schema customer and type FILE
  • 基准测试:PostgreSQL 上的 bigint 与 int

    我想提高数据库性能 在一个项目中 所有表都来自int to bigint 我认为这不仅在存储方面是一个糟糕的选择 因为int需要4 bytes and bigint需要8 bytes 但也与性能有关 所以我创建了一个小表1000万条目 其中
  • 如何使用 pgAdmin 恢复 postgreSQL 转储文件?

    我有一个 dmp 文件 想要从中恢复数据库 使用 pgAdmin 我该怎么做 在 PgAdmin3 内 在您正在使用的服务器中创建一个新数据库 右键单击该数据库并选择 恢复 使用 浏览器 按钮选择 dmp 文件 选择 恢复 开始恢复数据库
  • Postgres Notify 不适用于逻辑复制

    我正在使用逻辑复制将数据从 Postgres 10 4 复制到另一个 Postgres 10 4 实例 订阅者有多个触发器将事件记录到单个表中 该表有一个触发器 该触发器执行另一个函数 返回触发器 来为下游侦听器调用 NOTIFY 审计表上
  • PostgreSQL 的默认用户名和密码是什么?

    我正在开发一个默认使用 PostgreSQL 的开源应用程序DBMS https en wikipedia org wiki Database Database management system 现在 当我在系统上安装它时 它的配置是 P
  • 多态查询的数据库压力

    我在 JPA 中使用了超过 5 个子类的多态抓取 执行的查询如下 explain SELECT ohlcrawbea0 trade time AS trade ti3 11 ohlcrawbea0 avg price AS avg pric
  • 如何查明数据何时插入到 Postgres 中?

    我继承了一个现有的充满数据的 Postgres 数据库 大多数数据都有 created date 列值 一些早期数据是在跟踪之前插入的 是否有一个 Postgres 元数据表隐藏在某处 可以跟踪何时INSERT查询完成了吗 Postgres
  • Postgresql PITR 备份:处理多个数据库的最佳实践?

    大家好 我有一个带有许多数据库的 postgresql 8 3 服务器 实际上 我计划使用一个脚本来备份数据库 该脚本将所有备份存储在与数据库同名的文件夹中 例如 mypath backup my database1 mypath back
  • 使用 pyscopg2 和 PostgreSQL 将日期时间插入数据库

    我在使用 pyscopg2 的 insert 语句将日期时间戳插入 SQL 数据库时遇到问题 下面的代码所做的是每次按下按钮时 它都应该在数据库中插入一行 其中包含buildingID 只是文本 以及按下按钮时的日期和时间 我只是不知道如何
  • Heroku: PG::ConnectionBad: 无法连接到服务器: 连接被拒绝

    我尝试将新应用程序推送到 heroku 并出现此错误PG ConnectionBad could not connect to server Connection refused 这是我的 gemfile 与此有关系吗 我正在使用 spre

随机推荐

  • 重置 ARKit 坐标

    我有一个简单的问题 如果我想开始游戏并将棋盘放在我面前 gameBoard position SCNVector3 0 0 0 6 这一直有效 直到我离开游戏并再次回来为止 我可以在镜头前将游戏板展示在完全相同的位置吗 0 6m在我前面 我
  • 如何在 F# 中定义这种惰性(无限?)数据结构

    我在定义以下简单文本光标时遇到问题 该光标由元组表示 其中第一个元素是当前字符 如果函数获取下一个元素或崩溃 则第二个元素是 let rec nextAt index text if index lt String length text
  • BigQuery:通配文件模式时遇到错误

    我查询了包含 Google 电子表格中数据的联合表 遵循第 720 期中的建议https code google com p google bigquery issues detail id 720 https code google co
  • R:重新列出平面列表

    这个问题 https stackoverflow com questions 8139677有一个很好的解决方案 可以在保留列表数据类型的同时展平列表 其中unlist才不是 flatten function x unlist vector
  • 整数约束优化,目标函数表示执行另一个程序调用

    我正在研究整数优化问题 想尝试 GEKKO 问题描述 x1 x2 x3 x9 x10 x11 1 16 范围内的整数 是目标函数的 11 个整数参数 我想找到一组 x 值来最小化目标函数的输出 然而 由于问题无法用数学来表达 因此需要通过运
  • HTML 解析 - 从 div 内的表格获取数据?

    我对 HTML 解析 抓取的整个想法还比较陌生 我希望我能来这里获得我需要的帮助 基本上我想要做的 我认为 是指定我希望从中获取数据的页面的 url 在这种情况下 http www epgpweb com guild us Caelestr
  • 添加不同 data.frame 中缺失的列并填充 0 [重复]

    这个问题在这里已经有答案了 我有以下情况 df1 a b c d 1 2 3 4 df2 a c 5 6 我想要的结果是 用 df1 中缺失的列填充第二个 data frame 并用零填充它们 所以结果应该是 df3 a b c d 5 0
  • Flutter:从 Hive 盒创建对象流

    我正在尝试访问一些在整个应用程序中更改和访问的用户设置 为此 我使用 Hive 从框中检索用户设置 我想通过转动UserSettings对象检索自Hive box settings get userID 到一个流中 该流将被馈送到Strea
  • 如何从cloud firestore获取数据,其中user.uid等于flutter中的文档id?

    我有一个显示用户信息的个人资料屏幕 用户经过身份验证后 我将数据存储在云 Firestore 中 文档 ID 等于用户 ID 现在 我想从 cloud firestore 检索数据 当前 userId 等于文档 id 现在我有这个 clas
  • Python列表理解-原始列表中的“pop”结果?

    假设我有一个 Python 3 X 列表 我使用列表理解来返回该列表的子集 是否有一种简单 Pythonic 的方法可以将该子集从原始列表中 弹出 因此该子集中的元素在返回后不再位于原始列表中 谢谢 示例 我需要帮助定义 my func a
  • 如何将内部 div 与外部 div 的底部对齐?

    我需要将内部 div 与外部 div 的底部对齐 我的代码如下所示 div class myOuterDiv div class div1 floatLeft Variable content here div div class div2
  • Kotlin 协程 - 优雅地处理挂起函数中的错误

    尝试使用从异步方法调用的挂起函数来实现对错误的优雅处理 如何捕获挂起方法引发的错误 suspend fun findById id Long User throw Exception my exception intentionally t
  • GLSL聚光投影体积

    在我的开源项目中 我使用 Qt3D 设置了延迟渲染管道 到目前为止一切顺利 但现在我想通过添加聚光灯投影量来继续前进 例如场景中好像有烟雾 像这样 我正在使用的片段着色器位于问题的末尾 我读过 对于每个片段 我应该从光位置进行光线行进并找到
  • 不同元素的ggplot字体大小

    我知道在创建 ggplot 图后我可以使用theme get 返回所有主题元素的详细信息 这对于弄清楚诸如此类的事情非常有帮助strip text x等等 但我有两件事无法弄清楚 1 在下面的ggplot图形中 代表短语 被土拨鼠卡住的木头
  • 如何在 Java 中验证从 Azure AD B2C 生成的 JWT 令牌?

    我正在寻找 Java 代码示例来验证 Azure AD B2C 令牌 我们可以使用哪些依赖项 所有 JWT 令牌的 JWT 令牌验证步骤或代码是否相同还是会有所不同 我们的项目中没有使用 Spring Security 有大量的图书馆her
  • 使用 execv 和输入重定向的 C++ 管道命令

    尝试编写一个处理内部和外部命令的 shell 我一次可以获得内部命令和一个外部命令 我的问题是如何运行这样的命令 ls l grep lib wc l 我正在使用 fork 并通过 char 中的 execv 传递外部命令 关于如何工作有什
  • 保护 Excel VBA 代码的最佳方法? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经整理了一个简单的 Excel 数据库 该数据库执行一些宏函数 并且我需要将此数据库分发给几个人 但他们无法看到宏函数实际上是如何
  • 文件 API - Phonegap?

    谁能解释如何使用适用于 Android 的 Phonegap 文件 API 在页面上列出文件文件夹 我想列出所有 mp3如果可能的话 请阅读文件 但已阅读所有phonegap文档 http docs phonegap com en 1 0
  • 弹性搜索不提供页面大小较大的数据

    获取数据大小 约20 000 问题 在 python 中使用以下命令搜索 Elasticsearch 索引数据 但没有得到任何结果 from pyelasticsearch import ElasticSearch es repo Elas
  • 如何获取 PostgreSQL 中表上所有索引的列名列表?

    我有这个查询来获取表上的索引列表 SELECT ns nspname as schema name tab relname as table name cls relname as index name am amname as index