在Oracle 9i中显示外键关系

3

在Oracle 9i中,是否有一条命令可以显示表的外键以及这些外键所引用的表?

我进行了搜索,没有找到任何内容,但我发现了一个与MySql相似的等效命令,即SHOW CREATE TABLE

在Oracle的SQL中是否有等效的命令?

感谢您的回复,但是我认为是否有类似MySql的简单方法。

4个回答

4

我收到了一个非常长的错误消息,开头是: ORA-31603:模式“tset”中找不到类型为TABLE的对象“registration”我认为这可能是因为我正在使用Oracle 9i。 - D. Rattansingh
1
我看到了一个Oracle论坛的留言,建议你需要在SYS模式下创建get_ddl()过程,以便它具有访问系统元数据的正确权限。 - Bill Karwin
这里名称是区分大小写的,并且默认以大写形式存储,除非显式引用。因此REGISTRATION和TSET(或者应该是TEST)可能有效。 - Gary Myers
@igor-db:是的,说得好。Oracle说它是“不区分大小写”的,但这只是因为它将名称映射为大写字母存储。 - Bill Karwin

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,请尝试一下。 - ninesided

1

这个可能可以做到你想要的,它使用了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>';

噫...你想帮助别人,结果看看你得到了什么。 - Bill Karwin
我收到了以下错误信息:第7行出现错误: ORA-25154:USING子句的列部分不能有限定符。 - D. Rattansingh
我会用ON语法来重写这段代码,而不是使用USING语法。 - Bill Karwin

0
如果您未来需要外键的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';

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接