2016-11-29 8 views
1

私は外部キーのリストを持っています。私はこれらのFKのポイントと実際のポイントがどこにあるのかを調べたいと思います。Postgresで参照テーブルを取得する

私はFKのリストのようなので、持っている:

columnName0, columnName1, columnName2 

外部キー参照

  • columnName0参照table0.idTable0
  • columnName1参照table1.idTable1
  • columnName2参照table2.idTable2

いくつかのサンプルテーブル:

Table0

idTable0, PK 
name 

表1

idTable1, PK 
age 

表2

idTable2, PK 
createdOn 

サンプル結果:

| column  | referenced_column | referenced_table | 
|-------------|-------------------|------------------| 
| columnName0 | idTable0   | table0   | 
| columnName1 | idTable1   | table1   | 
| columnName2 | idTable2   | table2   | 

私はこのようにMySQLの中で何かを翻訳しようとしている:

SELECT DISTINCT 
    COLUMN_NAME AS column, 
    REFERENCED_COLUMN_NAME AS referenced_column, 
    REFERENCED_TABLE_NAME AS referenced_table 
FROM 
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE 
    COLUMN_NAME IN (?); 

私は残念ながら(ストレートアップクエリを使用する必要がありますするつもりです、ストアドプロシージャはありません)。

答えて

1

pg_constraintを照会することができます。列名の場合は、pg_attributeを検索する必要があります。外部キーは複数の列に基づいている可能性があります。conkeyconfkeypg_constraintです。列名のリストを取得するには、配列をネスト解除する必要があります。例:

select 
    conrelid::regclass table_name, 
    a1.attname column_name, 
    confrelid::regclass referenced_table, 
    a2.attname referenced_column, 
    conname constraint_name 
from (
    select conname, conrelid::regclass, confrelid::regclass, col, fcol 
    from pg_constraint c, 
    lateral unnest(conkey) col, 
    lateral unnest(confkey) fcol 
    where contype = 'f' -- foreign keys constraints 
    ) s 
join pg_attribute a1 on a1.attrelid = conrelid and a1.attnum = col 
join pg_attribute a2 on a2.attrelid = confrelid and a2.attnum = fcol; 

table_name | column_name | referenced_table | referenced_column | constraint_name  
------------+-------------+------------------+-------------------+------------------------ 
products | image_id | images   | id    | products_image_id_fkey 
(1 row) 
のPostgres 9.4では

以降機能unnest()は、複数の引数を有していてもよく、内側のクエリは次のようになります。

... 
    select conname, conrelid::regclass, confrelid::regclass, col, fcol 
    from pg_constraint c, 
    lateral unnest(conkey, confkey) u(col, fcol) 
    where contype = 'f' -- foreign keys constraints 
... 
+0

PostgreSQLは、情報スキーマビューをサポートしています。 –

+0

@ MikeSherrill'CatRecall ' - そうです、[PostgreSQLのマテリアライズドビューの権限と特権を一覧表示する](http://stackoverflow.com/a/38854833/1995738)を参照してください。 – klin

関連する問題