方法一:通过 \d 元子命令查看

 

skytf=> \d tbl_role
                                  Table "skytf.tbl_role"
  Column   |         Type          |                       Modifiers                       
-----------+-----------------------+-------------------------------------------------------
 id        | integer               | not null default nextval('tbl_role_id_seq'::regclass)
 role_name | character varying(32) | 
 exp       | bigint                | 
 wealth    | bigint                | 
 status    | character(1)          | 
 attr      | hstore                | 
Indexes:
    "tbl_role_pkey" PRIMARY KEY, btree (id)
    "idx_tbl_role_attr" gist (attr), tablespace "tbs_skytf_idx"

 备注:\d 加上表名,就能非常容易的显示表字段信息和索引信息,当然这不是本文开头问题的答案,
             提问的同学是想通过系统数据字典来查看这些信息,方法为以下。
 
方法二:查看 catalog 基表
 
 skytf=> select attrelid ::regclass, attname, atttypid ::regtype, attnotnull, attnum
skytf->   from pg_attribute
skytf->  where attrelid = 'tbl_role' ::regclass
skytf->    and attnum > 0
skytf->    and attisdropped = 'f';
 attrelid |  attname  |     atttypid      | attnotnull | attnum 
----------+-----------+-------------------+------------+--------
 tbl_role | id        | integer           | t          |      1
 tbl_role | role_name | character varying | f          |      2
 tbl_role | exp       | bigint            | f          |      3
 tbl_role | wealth    | bigint            | f          |      4
 tbl_role | status    | character         | f          |      5
 tbl_role | attr      | hstore            | f          |      6
(6 rows)



 备注:系统表 pg_attribute 存储表的每一个列信息,包括系统列,首先通过条件“attnum>0” 排除
             系统列 xmin,ctid 等; 接着通过条件“attisdropped='f'” 排除已被删除的列,因为在 pg 中
             被删除的列并没有物理删除,只是标记,可以通过这个字段过滤。
       
方法三:查看 information_schema 模式的视图
 
skytf=> select table_schema,
skytf->        table_name,
skytf->        column_name,
skytf->        data_type,
skytf->        column_default,
skytf->        is_nullable
skytf->   from information_schema.columns
skytf->  where table_name = 'tbl_role';
 table_schema | table_name | column_name |     data_type     |            column_default            | is_nullable 
--------------+------------+-------------+-------------------+--------------------------------------+-------------
 skytf        | tbl_role   | id          | integer           | nextval('tbl_role_id_seq'::regclass) | NO
 skytf        | tbl_role   | role_name   | character varying |                                      | YES
 skytf        | tbl_role   | exp         | bigint            |                                      | YES
 skytf        | tbl_role   | wealth      | bigint            |                                      | YES
 skytf        | tbl_role   | status      | character         |                                      | YES
 skytf        | tbl_role   | attr        | USER-DEFINED      |                                      | YES
(6 rows)              

备注:information_schema.columns 视图存储表和视图的字段信息,与前者不同的是,它并不存储系统
            字段信息,关于这个视图的其它字段,可以参考本文的参考部分。
        
           方法二,方法三是通过查看系统表或视图达到目标的,接下来介绍另一种方法,这种方法能非常全面
   的获得表定义,包括字段,索引,权限,甚至是序列信息,而不仅仅是字段信息。
补充一个查询表结构的SQL  同时进行了更改 我在使用regclass获得元id的时候发现如果表名是大写的无法找到
因此 只有改为我的这种模式

SELECT
	col.table_schema,
	col. TABLE_NAME,
	col.ordinal_position,
	col. COLUMN_NAME,
	col.data_type,
	col.character_maximum_length,
	col.numeric_precision,
	col.numeric_scale,
	col.is_nullable,
	col.column_default,
	des.description
FROM
	information_schema. COLUMNS col
LEFT JOIN pg_description des ON (
	SELECT
		oid
	FROM
		pg_class
	WHERE
		relname = col. TABLE_NAME
) = des.objoid
AND col.ordinal_position = des.objsubid
WHERE
	table_schema = 'public'
AND TABLE_NAME = 'XXXX'
ORDER BY
	ordinal_position;


SELECT
n.nspname ,
relname
FROM
pg_class c ,
pg_namespace n
WHERE
c.relnamespace = n.oid
AND nspname='schema 名称'
AND relkind = 'r'
AND relhassubclass
ORDER BY
nspname ,
relname;