Postgresql查询获取外键多列

标签 postgresql

我有这个架构:

create table "cat" (
    "name" varchar(64),
    "owner" varchar(64),
    primary key ("name", "owner")
);

create table "comment" (
    "name" varchar(45),
    "owner" varchar(45),
    "id" uuid,
    "comment" text,
    primary key ("id"),
    foreign key ("name", "owner") references "cat"("name", "owner")
);

我想获得从表“comment”到“cat”的外键列表,所以我使用:

SELECT
    tc.constraint_name, tc.table_name, kcu.column_name, 
    ccu.table_name AS foreign_table_name,
    ccu.column_name AS foreign_column_name 
FROM 
    information_schema.table_constraints AS tc 
    JOIN information_schema.key_column_usage AS kcu
      ON tc.constraint_name = kcu.constraint_name
    JOIN information_schema.constraint_column_usage AS ccu
      ON ccu.constraint_name = tc.constraint_name
WHERE constraint_type = 'FOREIGN KEY' 

;

几乎得到了我想要的:

  constraint_name  | table_name | column_name | foreign_table_name | foreign_column_name 
-------------------+------------+-------------+--------------------+---------------------
 comment_name_fkey | comment    | owner       | cat                | name
 comment_name_fkey | comment    | name        | cat                | name
 comment_name_fkey | comment    | owner       | cat                | owner
 comment_name_fkey | comment    | name        | cat                | owner

但是有第 1 行和第 4 行,我想在结果中删除它们,因为它不反射(reflect)列的依赖关系。我如何在 Postgresql 中执行此操作?

最佳答案

我认为你不能仅使用 information_schema 来做到这一点,但你可以直接查询表来做到这一点:

SELECT conname AS constraint_name, conrelid::regclass AS table_name, ta.attname AS column_name,
       confrelid::regclass AS foreign_table_name, fa.attname AS foreign_column_name
  FROM (
   SELECT conname, conrelid, confrelid,
          unnest(conkey) AS conkey, unnest(confkey) AS confkey
     FROM pg_constraint
    WHERE conname = 'comment_name_fkey'
      --and contype = 'f'
  ) sub
  JOIN pg_attribute AS ta ON ta.attrelid = conrelid AND ta.attnum = conkey
  JOIN pg_attribute AS fa ON fa.attrelid = confrelid AND fa.attnum = confkey

结果

  constraint_name  | table_name | column_name | foreign_table_name | foreign_column_name
-------------------+------------+-------------+--------------------+---------------------
 comment_name_fkey | comment    | name        | cat                | name
 comment_name_fkey | comment    | owner       | cat                | owner

关于Postgresql查询获取外键多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46032438/

相关文章:

postgresql "createdb"和 "CREATE DATABASE"产生一个非空数据库。 fork 是什么?

java - 如何使用 Hibernate 检索 SQL 错误消息

c# - 具有多个允许值类型的数据库字段

postgresql - 我可以获得一个 postgresql 锁来防止对表的一部分进行并发插入吗?

database - Golang-Postgres ..关闭数据库连接不适用于特定查询

sql - Postgres 限制另一个表中 WHERE IN id 中每个字段的行数

java - 将 MS Access 迁移到 PostgreSQL

PostgreSQL - 流式实体化 View 更改

postgresql - 存储过程的锁定和并发执行

python - 通过sqlalchemy查询 `pg_stat_database`查看