簡體   English   中英

PostgreSQL:獲取表的所有外鍵引用列表的 SQL 腳本

[英]PostgreSQL: SQL script to get a list of all foreign key references to a table

我有一個表,主鍵為breeds breed_name ,並希望獲取所有引用breeds的表、列和約束的列表,而不考慮breeds中引用的列。 如果有另一個表, cats並且具有如下約束:

CREATE TABLE cats 
(
    cat_name  text,
    cat_breed text,

    CONSTRAINT cat_breed_name 
        FOREIGN KEY (cat_breed) REFERENCES breeds(breed_name)
)

我應該像下面這樣返回一行:

base_table     base_col    referencing_table   referencing_col  constraint_sql
breeds         breed_name  cats                cat_breed        CONSTRAINT cat_breed_name FOREIGN KEY (cat_breed) REFERENCES breeds(breed_name)

還應該列出非主鍵引用,並且它應該處理復合鍵。

您必須將pg_constraint加入pg_attribute並取消嵌套列數組(可能是復合鍵)才能在基表中獲取引用的列名。 您必須使用pg_class來獲取表名。 pg_get_constraintdef為您提供用於創建約束的實際 SQL 行。

SELECT (select  r.relname from pg_class r where r.oid = c.confrelid) as base_table,
       a.attname as base_col,
       (select r.relname from pg_class r where r.oid = c.conrelid) as referencing_table,
       UNNEST((select array_agg(attname) from pg_attribute where attrelid = c.conrelid and array[attnum] <@ c.conkey)) as referencing_col,
       pg_get_constraintdef(c.oid) contraint_sql
  FROM pg_constraint c join pg_attribute a on c.confrelid=a.attrelid and a.attnum = ANY(confkey)
 WHERE c.confrelid = (select oid from pg_class where relname = 'breeds')
   AND c.confrelid!=c.conrelid;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM