PostgreSQL:如何查询表的字段信息? [转]
浏览(2460)方法一:通过 \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;
标签: