【发布时间】:2021-06-07 22:15:55
【问题描述】:
我正在使用 postgres 12.5。我一直在研究如何获取包含唯一索引的列的名称的答案。在结合 StackOverflow 和其他地方的一些答案后,我想出了这个解决方案
select i.relname as index_name,
a.attname as column_name
from pg_class c
inner join pg_index ix on c.oid=ix.indrelid
inner join pg_class i on ix.indexrelid=i.oid
inner join pg_attribute a on a.attrelid=c.oid and a.attnum=any(ix.indkey)
where c.oid='public.accounts'::regclass::oid
and ix.indisunique is true
order by array_position(ix.indkey, a.attnum) asc
该解决方案适用于传统列类型的唯一索引,但不适用于 jsonb 列类型中字段的唯一索引。请参阅此 SQLFiddle 中的示例
http://sqlfiddle.com/#!17/22f6d/4
在那个 SQLFiddle 中,您可以看到如何创建表并创建两个不同的唯一索引。您可以看到上述查询如何获取包含唯一索引但未获取 jsonb 字段名称的所有常规列名。但你也可以看到 jsonb 字段上的唯一索引确实发挥了作用。
如何修改(或替换)上述查询以返回包含 jsonb 字段的复合唯一索引的列的名称?
附言请不要建议我将字段从 jsonb 移到专用列。这是我继承的遗留架构,需要使其按原样工作
【问题讨论】:
-
我在小提琴“无法获取主机连接:无法从底层数据库获取连接!”时收到此错误。 (Postgresl 9.6)
-
他们的网站一定已经关闭了。它现在正在工作。
标签: postgresql jsonb