Postgresql 在Amazon红移中列出具有索引的列

Postgresql 在Amazon红移中列出具有索引的列,postgresql,amazon-redshift,Postgresql,Amazon Redshift,我需要查询红移元数据以获得表列列表,其中包含列是否是主键的一部分的信息 已经有一篇文章给出了PostgreSQL的答案,但不幸的是,它在红移时失败,出现“错误:42809:op ANY/ALL(array)requires array on right side”使用下面的查询: select * from pg_table_def where tablename = 'mytablename' 这将为您提供表的所有列以及它们的数据类型、编码,以及它是否具有排序键或dist键。我已经知道了如何

我需要查询红移元数据以获得表列列表,其中包含列是否是主键的一部分的信息

已经有一篇文章给出了PostgreSQL的答案,但不幸的是,它在红移时失败,出现“错误:42809:op ANY/ALL(array)requires array on right side”

使用下面的查询:

select * from pg_table_def where tablename = 'mytablename'

这将为您提供表的所有列以及它们的数据类型、编码,以及它是否具有排序键或dist键。

我已经知道了如何使用此选项


通过选择约束组件并解析关键列,可以利用几个月前发布的表DDL view AWS():

select schemaname,tablename, substring(ddl,charindex('(',ddl)+1, charindex(')',ddl)-1-charindex('(',ddl)) 
from 
(
SELECT 
    n.nspname AS schemaname
   ,c.relname AS tablename
   ,200000000 + CAST(con.oid AS INT) AS seq
   ,'\t,' + pg_get_constraintdef(con.oid) AS ddl
  FROM
  pg_constraint AS con
  INNER JOIN pg_class AS c
    ON c.relnamespace = con.connamespace
    AND c.relfilenode = con.conrelid
  INNER JOIN pg_namespace AS n
    ON n.oid = c.relnamespace 
  WHERE c.relkind = 'r'
  ORDER BY seq
)
请注意,此查询还提供外键列。通过在查询中添加

   where ddl like '%PRIMARY KEY%'

以下几点对我很有用:

    SELECT   n.nspname as schema_name,
       t.relname as table_name,
       i.relname as index_name,
       c.contype as index_type,
       a.attname as column_name,
       a.attnum AS column_position
    FROM  pg_class t
    INNER JOIN  pg_index      AS ix ON t.oid = ix.indrelid
    INNER JOIN  pg_constraint AS c  ON ix.indrelid = c.conrelid
    INNER JOIN  pg_class      AS i  ON i.oid = ix.indexrelid
    INNER JOIN  pg_attribute  AS a  ON a.attrelid = t.oid
    AND a.attnum= ANY(string_to_array(textin(int2vectorout(ix.indkey)),' ')::int[])
  INNER JOIN  pg_namespace  AS n  ON n.oid = t.relnamespace;

谢谢,但是结果不包括该列是否是主键的一部分的信息。如果我假设主键中没有超过3列,那么像这样的查询可能会用作解决方法选择attname column_name,attnotnull,format_type(atttypid,atttypmod)作为column_type,atttypmod,i.indprimary作为主键,col_description(attrelid,attnum)作为pg_属性c中的描述在c.attrelid=i.indrelid和(c.attnum=i.indkey[0]或c.attnum=i.indkey[1]或c.attnum=i.indkey[2]上左外连接pg_索引i)和i.i.其中c.attnum>0,而不是c.attisdropped和c.attrelid=100059,按attnum顺序排列?这是什么东西?还不如对数据库进行二进制转储并对其进行反向工程:-)这真的是获取此信息所必需的吗?真的没有像MySQL中那样的“显示创建表”吗(例如)
    SELECT   n.nspname as schema_name,
       t.relname as table_name,
       i.relname as index_name,
       c.contype as index_type,
       a.attname as column_name,
       a.attnum AS column_position
    FROM  pg_class t
    INNER JOIN  pg_index      AS ix ON t.oid = ix.indrelid
    INNER JOIN  pg_constraint AS c  ON ix.indrelid = c.conrelid
    INNER JOIN  pg_class      AS i  ON i.oid = ix.indexrelid
    INNER JOIN  pg_attribute  AS a  ON a.attrelid = t.oid
    AND a.attnum= ANY(string_to_array(textin(int2vectorout(ix.indkey)),' ')::int[])
  INNER JOIN  pg_namespace  AS n  ON n.oid = t.relnamespace;