2014-03-09

PostgreSQL: テーブルの主キーを列順に取得する

以前Postgresで複合主キーのテーブル群から主キー一覧を取ってくる必要があったので、また必要になった時のために残しておきます(あまりないかも…)。

    SELECT c.table_name       -- テーブル名
         , c.column_name      -- 列名
         , c.data_type        -- データ型
         , c.ordinal_position -- 列順

      FROM information_schema.columns c

INNER JOIN information_schema.constraint_column_usage ccu
        ON c.table_name       = ccu.table_name
       AND c.column_name      = ccu.column_name 

INNER JOIN information_schema.table_constraints tc
        ON tc.table_catalog   = c.table_catalog
       AND tc.table_schema    = c.table_schema
       AND tc.table_name      = c.table_name
       AND tc.constraint_name = ccu.constraint_name

     WHERE tc.constraint_type = 'PRIMARY KEY'
     --AND c.table_name       = '' -- 必要ならテーブル名で絞込み

  ORDER BY c.table_name
         , c.ordinal_position

今までinformation_schemaから値を取ってくることがなかったのであまり知識がないんですけど、columns → constraint_column_usage → table_constraints まで辿らないと「列に紐付く制約名が何で」(constraint_name)、「その制約名が主キーか」(constarint_type = ‘PRIMARY KEY’)が判断できないみたいです。