我可以很容易地找到屬於某個表的所有外鍵使用information_schemaPostgreSQL - 有什麼方法可以找到引用特定表的所有外鍵?
但我無法弄清楚如何從OTHER表中找到引用某個表的外鍵。
我想知道的是我的數據庫中哪些表的哪些表引用了我的一個表的主鍵。
我可以很容易地找到屬於某個表的所有外鍵使用information_schemaPostgreSQL - 有什麼方法可以找到引用特定表的所有外鍵?
但我無法弄清楚如何從OTHER表中找到引用某個表的外鍵。
我想知道的是我的數據庫中哪些表的哪些表引用了我的一個表的主鍵。
這是你在找什麼?
SELECT * FROM pg_constraint WHERE confrelid=<oid of destination table>
或者,如果你只是想看看他們互動,在\d <table name>
的輸出psql
顯示他們。
讓我們製作一些我們可以用於測試的表格。
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)
);
我更喜歡使用INFORMATION_SCHEMA視圖的這種東西,因爲我學習的是移植到其他數據庫管理系統。
我通常將應用程序連接在一起,但我認爲這是 更容易理解這裏的輸出,如果我連接列並給他們別名。小心的程序員將在所有連接中使用「全名」 - 目錄(數據庫),模式和名稱。
select distinct
KCU2.table_catalog || '.' || KCU2.table_schema || '.' || KCU2.table_name referenced_table,
RC.constraint_catalog || '.' || RC.constraint_schema || '.' || RC.constraint_name full_constraint_name,
KCU1.table_catalog || '.' || KCU1.table_schema || '.' || KCU1.table_name referencing_table
from information_schema.referential_constraints RC
inner join information_schema.key_column_usage KCU1 on
RC.constraint_catalog = KCU1.constraint_catalog and
RC.constraint_schema = KCU1.constraint_schema and
RC.constraint_name = KCU1.constraint_name
inner join information_schema.key_column_usage KCU2 on
RC.unique_constraint_catalog = KCU2.constraint_catalog and
RC.unique_constraint_schema = KCU2.constraint_schema and
RC.unique_constraint_name = KCU2.constraint_name
where
KCU2.table_catalog = 'sandbox' and
KCU2.table_schema = 'public' and
KCU2.table_name = 'test'
order by referenced_table, referencing_table
;
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,這似乎是你正在尋找的東西。