鶏頭のプログラム

Ruby, Javascript, C言語, SQLなどのプログラミング

備忘録(PostgreSQLで様々な一覧を取得)

今回の記事はPostgreSQLのよく使うわりにいつも調べているSQLの一覧について
備忘録として記載します。

テーブル一覧

select 
  relname as TABLE_NAME 
from 
  pg_stat_user_tables

テーブルとカラム一覧

select 
  cl.*
from 
  information_schema.columns cl
  inner join pg_stat_user_tables ut
    on cl.table_name = ut.relname
order by 
  ordinal_position;


外部キーの一覧を取得するSQL

SELECT
    tc.constraint_name, 
    tc.table_name, 
    kcu.column_name, 
    ccu.table_name AS foreign_table_name,
    ccu.column_name AS foreign_column_name 
FROM 
    information_schema.table_constraints  tc 
    INNER JOIN information_schema.key_column_usage  kcu
       ON tc.constraint_name = kcu.constraint_name
    INNER JOIN information_schesema.constraint_column_usage ccu
       ON ccu.constraint_name = tc.constraint_name
WHERE tc.constraint_type = 'FOREIGN KEY'


ログインユーザーのテーブル、カラムの一覧および
主キー及び外部キーの情報一覧

SELECT
        cl.table_name,
        cl.column_name,
        fk.constraint_name,
        fk.foreign_table_name,
        fk.foreign_column_name,
        fk.constraint_type
FROM
        information_schema.columns cl
        INNER JOIN pg_stat_user_tables ut
        ON ut.relname = cl.table_name
        LEFT OUTER JOIN 
           (SELECT     
                 tc.constraint_name, 
                 tc.table_name, 
                 kcu.column_name, 
                 ccu.table_name AS foreign_table_name,
                 ccu.column_name AS foreign_column_name,
                 tc.constraint_type
            FROM    
                 information_schema.table_constraints  tc 
                 INNER JOIN information_schema.key_column_usage  kcu
                 ON tc.constraint_name = kcu.constraint_name
                 INNER JOIN information_schema.constraint_column_usage ccu
                 ON ccu.constraint_name = tc.constraint_name
                 WHERE tc.constraint_type IN ('FOREIGN KEY','PRIMARY KEY')) fk
            ON fk.table_name = cl.table_name AND
                 fk.column_name = cl.column_name
ORDER BY
      cl.table_name,
      cl.ordinal_position;

なにか間違いやもっといい書き方等あれば教えていただけると有り難いです。