我有一个没有文档的数据库。
有一个表language_id
列,它是另一个表的外键。我想知道外键引用哪个表。我不想仅仅通过仔细观察所有表格来找出因为大约有120个表格而且不幸的是这些名称并不具有描述性。
有没有办法找到它?
我正在使用SQL Developer来查询远程Oracle 11g数据库。
答案 0 :(得分:3)
您可以使用以下内容查询数据字典:
select uc_r.table_name, ucc_r.column_name, uc_r.constraint_name,
uc_p.constraint_name, uc_p.table_name, ucc_p.column_name
from user_constraints uc_r
join user_cons_columns ucc_r on ucc_r.constraint_name = uc_r.constraint_name
join user_constraints uc_p on uc_p.constraint_name = uc_r.r_constraint_name
join user_cons_columns ucc_p on ucc_p.constraint_name = uc_p.constraint_name
and ucc_p.position = ucc_r.position
where uc_r.constraint_type = 'R';
查找所有外键约束(类型R),查找匹配的主/唯一键,并匹配两个表中的列。当然,您可以将其限制为特定的表,列或约束,但如果您尝试查找所有映射,则更广泛的视图可能会有用。
如果我创建一个虚拟的父/子关系,使用未命名的约束(这可能是你的名字不是描述性的意思):
create table language (id number primary key, name varchar2(10));
create table my_table (language_id references language(id));
然后该查询找到:
TABLE_NAME COLUMN_NAME CONSTRAINT_NAME CONSTRAINT_NAME TABLE_NAME COLUMN_NAME
----------- ------------- --------------- --------------- ----------- -------------
MY_TABLE LANGUAGE_ID SYS_C00111327 SYS_C00111326 LANGUAGE ID
从SQL Developer中,您还可以打开表查看器(从连接下的扩展表列表中,在左侧面板中);初始视图显示表格列,但如果单击“约束”选项卡,它将显示相同的信息 - 以及有关约束的更多信息。这只能一次显示一张表。
答案 1 :(得分:3)