2016-01-07 51 views

回答

0

這是你在找什麼?

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

或者,如果你只是想看看他們互動,在\d <table name>的輸出psql顯示他們。

1

讓我們製作一些我們可以用於測試的表格。

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,這似乎是你正在尋找的東西。

相關問題