Query a Table's Foreign Key relationships

后端 未结 9 1832
旧时难觅i
旧时难觅i 2020-12-03 01:40

For a given table \'foo\', I need a query to generate a set of tables that have foreign keys that point to foo. I\'m using Oracle 10G.

相关标签:
9条回答
  • 2020-12-03 01:50

    Download the Oracle Reference Guide for 10G which explains the data dictionary tables.

    The answers above are good but check out the other tables which may relate to constraints.

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

    Finally, get a tool like Toad or SQL Developer which allows you to browse this stuff in a UI, you need to learn to use the tables but you should use a UI also.

    0 讨论(0)
  • 2020-12-03 01:51

    All constraints for one table

    select 
    
        uc.OWNER,
        uc.constraint_name as TableConstraint1,
        uc.r_constraint_name as TableConstraint2,
        uc.constraint_type as constrainttype1,
        us.constraint_type as constrainttype2,
        uc.table_name as Table1,us.table_name as Table2,
        ucc.column_name as TableColumn1, 
        uccs.column_name as TableColumn2
    from user_constraints uc
        left outer join user_constraints us on uc.r_constraint_name = us.constraint_name
        left outer join USER_CONS_COLUMNS ucc on ucc.constraint_name = uc.constraint_name
        left outer join USER_CONS_COLUMNS uccs on uccs.constraint_name = us.constraint_name
    where uc.OWNER ='xxxx' and uc.table_name='xxxx' 
    
    0 讨论(0)
  • 2020-12-03 01:52

    The following statement should give the children and all of their descendents. I have tested it on an Oracle 10 database.

    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
    
    0 讨论(0)
  • 2020-12-03 01:54

    I know it's kinda late to answer but let me answer anyway, some of the answers above are quite complicated hence here is a much simpler take.

           `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'`
    
    0 讨论(0)
  • 2020-12-03 01:57

    This should work (or something close):

    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>'); 
    
    0 讨论(0)
  • 2020-12-03 01:58
    select      acc.table_name, acc.constraint_name 
    from        all_cons_columns acc
    inner join all_constraints ac
        on acc.constraint_name = ac.constraint_name
    where       ac.r_constraint_name in (
        select  constraint_name
        from    all_constraints
        where   table_name='yourTable'
        );
    
    0 讨论(0)
提交回复
热议问题