【问题标题】:Displaying foreign key relationships in Oracle 9i在 Oracle 9i 中显示外键关系
【发布时间】:2010-09-26 04:10:45
【问题描述】:

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

我正在搜索,没有找到任何东西,但我找到了一个与 MySql 一起使用的等效命令,即 SHOW CREATE TABLE

oracle 的 SQL 中是否有等效的命令?

感谢您的回复,但我认为像 MySql 那样做这件事的方法很短。

【问题讨论】:

    标签: oracle


    【解决方案1】:

    这是另一个答案: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

    【讨论】:

    • 我收到一条很长的错误消息,开头为: ORA-31603: object "registration" of type TABLE not found in schema "tset" 我想这可能是因为我正在使用 oracle 9i
    • 我看到一条 Oracle 论坛消息,建议您需要在 SYS 模式中创建 get_ddl() 过程,以便它拥有对系统元数据的正确权限。
    • 此处的名称区分大小写,除非明确引用,否则以大写形式存储。所以 REGISTRATION 和 TSET(或者应该是 TEST)可能会起作用。
    • @igor-db:是的,好点。 Oracle 说它“不区分大小写”,但这只是因为它在存储名称时将名称映射为大写。
    【解决方案2】:

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

    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”前缀/后缀。

    【讨论】:

    • 我已将其更新为使用 all_constraints 而不是 user_constraints,试试看大小
    【解决方案3】:

    这可以做你想做的事,它使用 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>';
    

    【讨论】:

    • 耶……你试着帮忙,看看你能得到什么。
    • 我收到以下错误消息:第 7 行出现错误:ORA-25154:USING 子句的列部分不能有限定符
    • 我将用 ON 语法而不是 USING 重写它。
    【解决方案4】:

    如果你以后需要外键的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';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 2019-06-21
      • 1970-01-01
      • 2020-12-09
      • 1970-01-01
      相关资源
      最近更新 更多