查询表的外键关系

时间:2020-03-05 18:59:34  来源:igfitidea点击:

对于给定的表" foo",我需要一个查询来生成一组表,这些表具有指向foo的外键。我正在使用Oracle 10G。

解决方案

回答

这应该工作(或者接近):

select table_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 here>');

回答

下载Oracle参考指南10G,其中介绍了数据字典表。

上面的答案很好,但请查看其他可能与约束有关的表。

SELECT * FROM DICT WHERE TABLE_NAME LIKE '%CONS%';

最后,获得Toad或者SQL Developer之类的工具,使我们可以在UI中浏览这些东西,我们需要学习使用表,但也应该使用UI。

回答

链接到Oracle数据库在线文档

我们可能需要浏览数据字典视图。它们具有前缀:

  • 用户
  • 全部
  • 数据库管理员

样本:

select * from dictionary where table_name like 'ALL%'

继续Mike的示例,我们可能需要生成脚本来启用/禁用约束。我只修改了第一行中的"选择"。

select  'alter table ' || TABLE_NAME || ' disable constraint ' || 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 here>');

回答

以下陈述应给孩子们及其所有后代。我已经在Oracle 10数据库上对其进行了测试。

SELECT  level, main.table_name  parent,
    link.table_name child
FROM    user_constraints main, user_constraints link    
WHERE   main.constraint_type    IN ('P', 'U')
AND link.r_constraint_name  = main.constraint_name
START WITH main.table_name  LIKE UPPER('&&table_name')
CONNECT BY main.table_name = PRIOR link.table_name
ORDER BY level, main.table_name, link.table_name