2016-11-29 45 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。外鍵可能基於多列,所以pg_constraintconkeyconfkey是數組。你必須unnest數組才能得到列名。例如:

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