[英]PostgreSQL: SQL script to get a list of all tables that have a particular column as foreign key
[英]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.