PostgreSQL - 有什么方法可以找到引用某个表的所有外键吗?

时间:2016-01-07 22:38:28

标签: postgresql

我可以使用information_schema

很好地找到属于某个表的所有外键

但我无法弄清楚如何从OTHER表中找到引用某个表的外键。

我想知道的是我的数据库中的哪些表引用了我的一个表的主键。

2 个答案:

答案 0 :(得分:1)

让我们制作一些可用于测试的表格。

cellLayoutMarginsFollowReadableWidth = false

我更喜欢将information_schema视图用于这种东西,因为我学到的东西可以移植到其他数据库管理系统。

我通常将串联留给应用程序,但我认为是 如果我连接列并给它们别名,这里更容易理解输出。细心的程序员将在所有连接中使用“全名” - 目录(数据库),模式和名称。

create table test (
  n integer primary key
);

-- There might be more than one schema.
create schema scratch;
create table scratch.a (
 test_n integer not null references test (n),
 incept_date date not null default current_date,
 primary key (test_n, incept_date)
);

create table b (
 test_n integer not null references test (n),
 incept_date date not null default current_date,
 primary key (test_n, incept_date)
);

-- The same table name can exist in different schemas.
create table scratch.b (
 test_n integer not null references test (n),
 incept_date date not null default current_date,
 primary key (test_n, incept_date)
);
referenced_table     full_constraint_name           referencing_table
--
sandbox.public.test  sandbox.public.b_test_n_fkey   sandbox.public.b
sandbox.public.test  sandbox.scratch.a_test_n_fkey  sandbox.scratch.a
sandbox.public.test  sandbox.scratch.b_test_n_fkey  sandbox.scratch.b

我认为这会让你开始。外键不必引用主键;它可以引用任何候选键。此查询告诉您哪些表具有我们的测试表的外键,sandbox.public.test,这似乎是您正在寻找的。

答案 1 :(得分:0)

这是你要找的吗?

SELECT * FROM pg_constraint WHERE confrelid=<oid of destination table>

或者,如果您只想以交互方式查看它们,则会在\d <table name>的{​​{1}}输出中显示。