Rud*_*ski 188 sql oracle foreign-keys oracle-sqldeveloper
在Oracle SQL Developer中,如果我正在查看表中的信息,我可以查看约束,这可以让我看到外键(以及此表引用哪些表),并且我可以查看依赖项以查看内容包等参考表.但我不知道如何找到哪些表引用该表.
例如,假设我正在看emp桌子.还有另一个表emp_dept,用于捕获哪些员工在哪些部门(emp通过该表引用表emp_id)的主键中工作emp.有没有办法(通过程序中的某些UI元素,而不是通过SQL)找到emp_dept表引用emp表,而不必知道emp_dept表存在?
Fer*_*anB 246
不可以.Oracle SQL Developer没有这样的选项.
您必须手动执行查询或使用其他工具(例如PLSQL Developer有此选项).以下SQL是PLSQL Developer使用的SQL:
select table_name, constraint_name, status, owner
from all_constraints
where r_owner = :r_owner
and constraint_type = 'R'
and r_constraint_name in
(
select constraint_name from all_constraints
where constraint_type in ('P', 'U')
and table_name = :r_table_name
and owner = :r_owner
)
order by table_name, constraint_name
Run Code Online (Sandbox Code Playgroud)
r_owner架构在哪里,并且r_table_name是您正在寻找引用的表.名称区分大小写
要小心,因为在Oracle SQL Developer的"报告"选项卡上有"All tables/Dependencies"选项,它来自ALL_DEPENDENCIES,它指的是" 当前用户可访问的过程,包,函数,包体和触发器之间的依赖关系,包括依赖关系创建没有任何数据库链接的视图." .然后,此报告对您的问题没有任何价值.
小智 106
要将此作为扩展添加到SQL Developer,请执行以下操作:
<items>
<item type="editor" node="TableNode" vertical="true">
<title><![CDATA[FK References]]></title>
<query>
<sql>
<![CDATA[select a.owner,
a.table_name,
a.constraint_name,
a.status
from all_constraints a
where a.constraint_type = 'R'
and exists(
select 1
from all_constraints
where constraint_name=a.r_constraint_name
and constraint_type in ('P', 'U')
and table_name = :OBJECT_NAME
and owner = :OBJECT_OWNER)
order by table_name, constraint_name]]>
</sql>
</query>
</item>
</items>
Run Code Online (Sandbox Code Playgroud)
将扩展添加到SQL Developer:
导航到任何表,您现在应该看到SQL 1旁边的另一个选项卡,标记为FK References,它显示新的FK信息.
参考
lex*_*exu 33
在下面的查询中用emp替换[Your TABLE]
select owner,constraint_name,constraint_type,table_name,r_owner,r_constraint_name
from all_constraints
where constraint_type='R'
and r_constraint_name in (select constraint_name
from all_constraints
where constraint_type in ('P','U')
and table_name='[YOUR TABLE]');
Run Code Online (Sandbox Code Playgroud)
2015年5月发布的SQL Developer 4.1添加了一个Model选项卡,显示了以实体关系图格式引用表的表外键.
您可以从ALL_CONSTRAINTS视图中查询:
SELECT table_name
FROM ALL_CONSTRAINTS
WHERE constraint_type = 'R' -- "Referential integrity"
AND r_constraint_name IN
( SELECT constraint_name
FROM ALL_CONSTRAINTS
WHERE table_name = 'EMP'
AND constraint_type IN ('U', 'P') -- "Unique" or "Primary key"
);
Run Code Online (Sandbox Code Playgroud)
小智 5
SELECT DISTINCT table_name,
constraint_name,
column_name,
r_table_name,
position,
constraint_type
FROM (SELECT uc.table_name,
uc.constraint_name,
cols.column_name,
(SELECT table_name
FROM user_constraints
WHERE constraint_name = uc.r_constraint_name) r_table_name,
(SELECT column_name
FROM user_cons_columns
WHERE constraint_name = uc.r_constraint_name
AND position = cols.position) r_column_name,
cols.position,
uc.constraint_type
FROM user_constraints uc
inner join user_cons_columns cols
ON uc.constraint_name = cols.constraint_name
WHERE constraint_type != 'C')
START WITH table_name = '&&tableName'
AND column_name = '&&columnName'
CONNECT BY NOCYCLE PRIOR table_name = r_table_name
AND PRIOR column_name = r_column_name;
Run Code Online (Sandbox Code Playgroud)