【问题标题】:PostgreSQL: SQL script to get a list of all foreign key references to a tablePostgreSQL:获取表的所有外键引用列表的 SQL 脚本
【发布时间】:2022-06-20 02:40:09
【问题描述】:

我有一个表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  contraint_sql
breeds         breed_name  cats                cat_breed        CONSTRAINT cat_breed_name FOREIGN KEY (cat_breed) REFERENCES breeds(breed_name)

还应该列出非主键引用,并且它应该处理复合键。

【问题讨论】:

    标签: sql database postgresql foreign-keys information-schema


    【解决方案1】:

    您必须将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;
    

    【讨论】:

      猜你喜欢
      • 2011-07-17
      • 2019-08-22
      • 1970-01-01
      • 1970-01-01
      • 2016-07-10
      • 2018-12-21
      • 1970-01-01
      • 2010-10-03
      相关资源
      最近更新 更多