SELECT
stat.relname AS tableName,--テーブル名
att.attname AS columnName,--カラム名
att.attnum AS columnNumber, --カラム番号
CASE type.typname
WHEN '_bpchar' THEN 'char' WHEN '_varchar' THEN 'varchar' WHEN '_date' THEN 'date' WHEN '_float8' THEN 'float8' WHEN '_int4' THEN 'integer' WHEN '_interval' THEN 'interval' WHEN '_numeric' THEN 'numeric' WHEN '_float4' THEN 'float4' WHEN '_int2' THEN 'smallint' WHEN '_text' THEN 'text' WHEN '_time' THEN 'time' WHEN '_timestamp' THEN 'timestamp'
END AS columnType,--カラムのデータ型
CASE type.typname
WHEN '_bpchar' THEN att.atttypmod - 4 WHEN '_varchar' THEN att.atttypmod - 4 WHEN '_numeric' THEN (att.atttypmod - 4) / 65536 ELSE att.attlen
END AS ColumnLength,--カラムの長さ
CASE type.typname
WHEN '_numeric' THEN (att.atttypmod - 4) % 65536 ELSE 0
END AS floatPart, --小数点絡み(あれば)
con_u.conname,--制約。uniqueなどの場合に出る
CASE con_u.contype
WHEN 'u' THEN 'unique' ELSE NULL
END AS isUnique,--unique制約があるかどうか
CASE con_p.contype
WHEN 'p' THEN 'primary' ELSE NULL
END AS isPrimary--primarykeyかどうか
FROM pg_stat_user_tables stat
INNER JOIN pg_attribute att ON att.attrelid = stat.relid
INNER JOIN pg_type type ON att.atttypid = type.typelem
INNER JOIN pg_class class ON class.relname = stat.relname
LEFT JOIN pg_constraint con_u ON con_u.conkey[1] = att.attnum
AND con_u.contype = 'u' AND con_u.conrelid = class.relfilenode
LEFT JOIN pg_constraint con_p ON att.attnum = ANY (con_p.conkey)
AND con_p.contype = 'p' AND con_p.conrelid = class.relfilenode
WHERE 1 = 1
AND stat.schemaname = 'スキーマ名'--スキーマを指定
AND att.attnum > 0
AND substr(type.typname,1,1) = '_'
AND stat.relname = 'テーブル名' --テーブルを指定
ORDER BY stat.schemaname, stat.relname, att.attnum
SELECT
stat.relname AS tableName,--制約のあるテーブル(where句で指定したテーブル
array_accum(att.attname) AS columnName,--制約付きのカラム名(配列型)
con_f.conname AS f_keyName,--制約名
class_f.relname AS f_tableName,--外部キーの所属するテーブル
con_f.conkey--外部キーのカラム番号
FROM pg_stat_user_tables stat
INNER JOIN pg_attribute att ON att.attrelid = stat.relid
INNER JOIN pg_type type ON att.atttypid = type.typelem
INNER JOIN pg_class class ON class.relname = stat.relname
INNER JOIN pg_constraint con_f ON ( att.attnum = ANY (con_f.conkey)
AND con_f.contype = 'f' AND con_f.conrelid = class.relfilenode )
INNER JOIN pg_class class_f ON class_f.relfilenode = con_f.confrelid
WHERE 1 = 1
AND stat.schemaname = 'スキーマ名'
AND att.attnum > 0
AND substr (type.typname,1,1) = '_'
AND stat.relname = 'テーブル名'
GROUP BY stat.relname, con_f.conname, class_f.relname, con_f.conkey