通过SQL等效的Postgres \ d +(显示关系信息)

时间:2018-11-04 10:26:43

标签: sql postgresql psql

我看过几个例子,例如herehere

我能够做大部分我能做的事,但不是全部。

如果我有:

\d+ myschema.mytable

我列出了所有列和索引。索引的格式例如:

Indexes:
    "id_pkey" PRIMARY KEY, btree (id,name,timestamp)
    "ix05_id" btree (name,company)

我能够通过sql以及有关索引和键的列来获取信息,我已经从上面的帖子中找到了一些sql,但是并不能完全采用这种格式。

所以对于键,我能够做到:

SELECT               
  pg_attribute.attname, 
  format_type(pg_attribute.atttypid, pg_attribute.atttypmod) 
FROM pg_index, pg_class, pg_attribute, pg_namespace 
WHERE 
  pg_class.oid = 'mytable'::regclass AND 
  indrelid = pg_class.oid AND 
  nspname = 'myschema' AND 
  pg_class.relnamespace = pg_namespace.oid AND 
  pg_attribute.attrelid = pg_class.oid AND 
  pg_attribute.attnum = any(pg_index.indkey)
 AND indisprimary

因此,这一行获取键所适用的列,而不是索引/键的名称?如何在上面的查询中添加呢?我需要加入哪个表?

对于我能够做的索引

SELECT * FROM pg_indexes WHERE tablename = 'mytable' AND schemaname = 'myschema' ;

哪个获取索引,但未明确列出它们适用的列-我仅看到indexdef的创建方式?我可以通过与其他表连接来获取该信息,还是必须解析indexdef并获取适用于列的列?

1 个答案:

答案 0 :(得分:5)

psql has a -E option

  

-E
  --echo-hidden

     

回显\d和其他反斜杠命令生成的实际查询。您可以使用它来研究psql的内部操作。这等效于将变量ECHO_HIDDEN设置为on。

因此,如果您运行psql -E并执行\d+ myschema.mytable,则应该确切看到内部执行了哪些SQL查询。