본문 바로가기

DB

PostgreSQL Table 목록 추출

PostgreSQL DB 테이블 정의서 만들때 사용하고 있습니다.

구글에서 검색해서 사용하던 쿼리 입니다.

 

SELECT
info. TABLE_NAME as 테이블ID,
tb_comm.tb_comm as 테이블명,
info. COLUMN_NAME as 컬럼ID,
comm.column_comment as 컬럼명,
info.udt_name as 데이터타입,
case when info.character_maximum_length is null then info.numeric_precision else info.character_maximum_length end as length,
info.is_nullable NullOption,
case when pri_key.column_name is null then '' else 'PK' end as PK
FROM
information_schema. COLUMNS info
left join (
SELECT N.NSPNAME, C.RELNAME, OBJ_DESCRIPTION(C.OID) as tb_comm
FROM PG_CATALOG.PG_CLASS C INNER JOIN PG_CATALOG.PG_NAMESPACE N ON C.RELNAMESPACE=N.OID 
WHERE C.RELKIND = 'r'
) tb_comm on info.TABLE_NAME = tb_comm.RELNAME and info.table_schema = tb_comm.NSPNAME
LEFT JOIN (
SELECT
PS.schemaname as SCHEMA_NAME,
PS.RELNAME AS TABLE_NAME,
PA.ATTNAME AS COLUMN_NAME,
PD.DESCRIPTION AS COLUMN_COMMENT
FROM
PG_STAT_ALL_TABLES PS,
PG_DESCRIPTION PD,
PG_ATTRIBUTE PA
WHERE
PS.RELID = PD.OBJOID
AND PD.OBJSUBID <> 0
AND PD.OBJOID = PA.ATTRELID
AND PD.OBJSUBID = PA.ATTNUM
ORDER BY
PS.RELNAME,
PD.OBJSUBID
) comm ON comm.SCHEMA_NAME = info.table_schema
AND comm. TABLE_NAME = info. TABLE_NAME
AND comm. COLUMN_NAME = info. COLUMN_NAME
LEFT JOIN (
SELECT
CC.*
FROM
INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC,
INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE CC
WHERE
TC.CONSTRAINT_TYPE = 'PRIMARY KEY'
   AND TC.TABLE_CATALOG   = CC.TABLE_CATALOG
   AND TC.TABLE_SCHEMA    = CC.TABLE_SCHEMA
   AND TC.TABLE_NAME      = CC.TABLE_NAME
   AND TC.CONSTRAINT_NAME = CC.CONSTRAINT_NAME
) pri_key ON pri_key.table_schema = info.table_schema
AND pri_key. table_name = info.TABLE_NAME
AND pri_key. column_name = info. COLUMN_NAME
WHERE
info.table_schema = 'postgres' 
ORDER BY
info. TABLE_NAME,
info.ordinal_position;