代码之家  ›  专栏  ›  技术社区  ›  Mark Roddy

查询表的外键关系

  •  22
  • Mark Roddy  · 技术社区  · 17 年前

    对于给定的表“foo”,我需要一个查询来生成一组表,这些表具有指向foo的外键。我用的是Oracle10g。

    7 回复  |  直到 17 年前
        1
  •  40
  •   Mike Monette    17 年前

    这应该是有效的(或接近的):

    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>'); 
    
        2
  •  4
  •   yoozer8    13 年前

    下面的语句将给出孩子及其所有后代。我在Oracle10数据库上测试过它。

    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
    
        3
  •  2
  •   matt1616    11 年前

    以下是如何进一步了解Mike的问题 列名 从约束名称:

    select * from user_cons_columns
    where constraint_name in (
      select 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 name here>'));
    
        4
  •  1
  •   Tony R    17 年前

    链接到 Oracle Database Online Documentation

    您可能想探索 Data Dictionary views . 它们有前缀:

    • 用户
    • 所有
    • 数据库管理员

    样品:

    select * from dictionary where table_name like 'ALL%' 
    

    继续Mike的示例,您可能希望生成脚本以启用/禁用约束。我只修改了第一行的“select”。

    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>');
    
        5
  •  1
  •   arvinq    9 年前

    我知道现在回答有点晚,不过还是让我来回答吧,上面的一些答案很复杂,所以这里有一个更简单的答案。

           `SELECT a.table_name child_table, a.column_name child_column, a.constraint_name, 
           b.table_name parent_table, b.column_name parent_column
           FROM all_cons_columns a
           JOIN all_constraints c ON a.owner = c.owner AND a.constraint_name = c.constraint_name
           join all_cons_columns b on c.owner = b.owner and c.r_constraint_name = b.constraint_name
           WHERE c.constraint_type = 'R'
           AND a.table_name = 'your table name'`
    
        6
  •  0
  •   arco444    10 年前
    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;   
    
        7
  •  0
  •   Ordiel    8 年前

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

    上面的答案是好的,但请查看其他与约束相关的表格。

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

    最后,获得一个工具,比如toad或sql developer,它允许您在一个UI中浏览这些东西,您需要学习使用表,但是您也应该使用一个UI。

    推荐文章