代码之家  ›  专栏  ›  技术社区  ›  D. Rattansingh

在Oracle 9i中显示外键关系

  •  3
  • D. Rattansingh  · 技术社区  · 17 年前

    oracle 9i中是否有一个命令显示表的外键以及这些外键引用的表?

    我在搜索,没有找到任何东西,但是我找到了一个与mysql一起工作的等效命令,即show create table

    在oracle的sql中是否有与此类似的命令?

    我很感谢你的回复,但是我认为像mysql这样做的方法很短。

    4 回复  |  直到 16 年前
        1
  •  4
  •   Bill Karwin    17 年前

    另一个答案是 dbms_metadata 包有一个函数,可以返回表定义的ddl。

    SELECT dbms_metadata.get_ddl('TABLE', '<table>', '<schema>') FROM dual;
    

    这个包显然是从Oracle 9.2开始提供的

    http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96612/d_metada.htm#1656

        2
  •  2
  •   ninesided    17 年前

    首先可以列出表的所有约束以及其他表上的任何引用约束:

    SELECT
         acc.table_name
        ,acc.column_name
        ,acc.constraint_name
        ,ac.r_constraint_name AS referenced_constraint
    FROM all_cons_columns acc
    INNER JOIN all_constraints ac ON (acc.constraint_name = ac.constraint_name)
    WHERE acc.table_name = UPPER('your_table_here');
    

    如果您对约束有合理的命名约定,那么应该可以识别哪些是外键,典型的是“fk”前缀/后缀。

        3
  •  1
  •   Bill Karwin    17 年前

    这可以满足您的需要,它使用Oracle系统视图。但是,我没有一个oracle实例来测试它。

    SELECT fk.owner, fk.constraint_name, fk.table_name, fc.column_name,
      pk.owner, pk.constraint_name, pk.table_name, pc.column_name
    FROM all_constraints fk
     JOIN all_cons_columns fc ON (fk.owner = fc.owner AND fk.constraint_name = fc.constraint_name)
     JOIN (all_constraints pk
       JOIN all_cons_columns pc ON (pk.owner = pc.owner AND pk.constraint_name = pc.constraint_name)) 
     ON (fk.r_owner = pk.owner AND fk.r_constraint_name = pk.constraint_name
       AND fc.position = pc.position)
    WHERE fk.constraint_type = 'R' AND pk.constraint_type IN ('P', 'U')
      AND fk.owner = '<schema>' AND fk.table_name = '<table>';
    
        4
  •  0
  •   bpelhos    16 年前

    如果将来需要外键的ddl,那么下面是预先的答案:)

    select 
      DBMS_METADATA.GET_DEPENDENT_DDL('REF_CONSTRAINT' ,atb.table_name, atb.owner) 
    from 
      all_tables atb, all_constraints ac
    where 
      atb.owner = ac.owner and
      ac.constraint_type = 'R' and
      ac.table_name = atb.table_name and
      atb.owner = 'YOURSCHEMA';