我有很多表,它们之间有很多关系。当我尝试在它们之间进行某种连接时,我总是在寻找两个表之间的关系。
为简单起见,假设我有表A 和表B 。它们与外键链接。
问:如何在这两个确切的表及其引用的列之间找到外键?并不是所有引用此表的表或外键。
答案 0 :(得分:3)
您可以将与数据字典约束相关的视图彼此连接在一起,并找到任何引用约束的两端。
有点粗糙,但类似:
select uc1.constraint_name, uc1.table_name, ucc1.column_name,
uc2.constraint_name, uc2.table_name, ucc2.column_name
from user_constraints uc1
join user_cons_columns ucc1 on ucc1.constraint_name = uc1.constraint_name
join user_constraints uc2 on uc2.constraint_name = uc1.r_constraint_name
join user_cons_columns ucc2 on ucc2.constraint_name = uc2.constraint_name
and ucc2.position = ucc1.position
where uc1.table_name in (<table1>, <table2>)
and uc1.constraint_type = 'R'
and uc2.table_name in (<table1>, <table2>)
and uc2.constraint_type in ('P', 'U');
我假设您可能具有复合键,并且不知道两个表之间的关系是哪种方式-因此在here
子句的两个过滤器中查找其中一个名称。我还使用user_tables
进行了简化,甚至忽略了owner
列-如果引用跨越了模式,则可以包括它,并使用all_*
表而不是{{ 1}}个。
快速演示:
user_*
create table t1 (
id number,
uniq1 number,
uniq2 number,
constraint t1_pk primary key (id),
constraint t1_uk unique (uniq1, uniq2)
);
create table t2 (
id number,
t1_id number,
t1_uniq1 number,
t1_uniq2 number,
constraint t2_fk_1 foreign key (t1_id) references t1 (id),
constraint t2_fk_2 foreign key (t1_uniq1, t1_uniq2) references t1 (uniq1, uniq2)
);
select uc1.constraint_name as foreign_key,
uc1.table_name as child_table,
ucc1.column_name as child_column,
ucc1.position,
uc2.constraint_name as pri_or_uniq_key,
uc2.table_name as parent_table,
ucc2.column_name as parent_column
from user_constraints uc1
join user_cons_columns ucc1 on ucc1.constraint_name = uc1.constraint_name
join user_constraints uc2 on uc2.constraint_name = uc1.r_constraint_name
join user_cons_columns ucc2 on ucc2.constraint_name = uc2.constraint_name
and ucc2.position = ucc1.position
where uc1.table_name in ('T1', 'T2')
and uc1.constraint_type = 'R'
and uc2.table_name in ('T1', 'T2')
and uc2.constraint_type in ('P', 'U')
order by foreign_key, position;
答案 1 :(得分:1)
尽管重要的是要知道在哪里可以找到这样的信息,但是GUI工具会很有帮助。
GUI工具可以帮助您创建一个 ER图,这会带来更多帮助。您将选择表,然后让该 tool 创建它。然后,您会在前面出现 schema ,所有表格都作为 rectangles 和 links 作为线。
是的-如果表很多,该图将是一个很大的表,创建该表将花费一些时间,并且它可能不容易阅读,因为表不会彼此相邻放置。 (取决于它们之间的关系)。但是,如果您足够耐心,您将对其进行重新安排并从中受益。