PostgreSQL:如何查询表的字段信息?

今天 PostgreSQL bbs里有人问到如何通过查询数据字典获得表字段信息的问题,虽然比较基础,依然总结下。

首先,在 PostgreSQL 中,提供一种称为元子命令的命令,可以方便的查看数据库对像信息,包括表结构,表索引等信息,如下:

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

通过元子命令 /d 查看表结构,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
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 基表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 模式的视图,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 视图存储表和视图的字段信息,与前者不同的是,它并不存储系统字段信息,关于这个视图的其它字段,可以参考本文的参考部分。方法二,方法三是通过查看系统表或视图达到目标的,接下来介绍另一种方法,这种方法能非常全面的获得表定义,包括字段,索引,权限,甚至是序列信息,而不仅仅是字段信息。

方法四: 使用 pg_dump

使用 pg_dump 导出表 skytf.tbl_role 定义,如下:

1
pg_dump -h 127.0.0.1 -E UTF8 -t "skytf.tbl_role" -s -v skytf > skytf.tbl_role.ddl

备注:-s 表示仅导出表定义,不导表数据,最后查看文件 skytf.tbl_role 确认下。

参考

附一: 查询表定义的SQL

补充一个查询表结构的SQL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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 col.table_name::regclass = des.objoid
AND col.ordinal_position = des.objsubid
WHERE
table_schema = 'XXXX'
AND table_name = 'XXXX'
ORDER BY
ordinal_position;

附二: 查询 Table 列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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;

原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/237934.html

(0)
上一篇 2022年1月29日
下一篇 2022年1月29日

相关推荐

发表回复

登录后才能评论