【问题标题】:Oracle: Programmatic way to identify foreign key dependencies? [duplicate]Oracle:识别外键依赖项的编程方式? [复制]
【发布时间】:2013-07-18 21:29:21
【问题描述】:

我想确定几个表之间的外键关系。给定一个表名和列名,我如何识别其他哪些表与该列有外键关系?

(table name, column name) -> (list of tables,columns with FK dependency)

【问题讨论】:

  • 有一些方法可以查询数据字典以查找定义的 FK 约束,正如其他人所建议的那样。但是,应该注意,某些应用程序可能没有定义 FK 约束,而是依靠应用程序来强制执行数据库完整性。例如Oracle自己的E-Business Suite在数据库中的数千个表中不使用FK约束。
  • @JohnDoyle,我不认为这是一个重复的问题。这个问题需要基于表和列的更窄范围的键。引用的问题显示了如何获取模式中的所有 FK 关系。相似,但不完全相同。

标签: oracle


【解决方案1】:

你可能会做这样的事情:

select x.owner || '.' || x.table_name || '.' || x.column_name childcol,
       y.owner || '.' || y.table_name || '.' || y.column_name parentcol,
       z.constraint_name
  from all_cons_columns x,
       all_cons_columns y,
       all_constraints z
 where x.constraint_name = z.constraint_name
   and z.owner = x.owner
   and y.constraint_name = z.r_constraint_name
   and z.constraint_type = 'R'

您还需要在谓词中包含您要查找的表是外键关系中的父表还是子表。

【讨论】:

    【解决方案2】:

    我使用此查询来比较外键引用的列,因为我们的 DBA 要求它们具有相同的类型和相同的精度。也许它可以帮助你。

    您可以根据您的权限使用前缀 DBA、ALL 或 USER:

    SELECT   uc.constraint_name,ucc1.TABLE_NAME,ucc1.column_name,a.data_type||'('||nvl(a.data_precision,a.data_length)||')' length,
             ucc2.TABLE_NAME references_table,ucc2.column_name references_column, b.data_type||'('||nvl(b.data_precision,b.data_length)||')' length
    FROM     user_constraints uc
    ,        user_cons_columns ucc1
    ,        user_cons_columns ucc2
    ,        user_tab_columns a
    ,        user_tab_columns b
    WHERE    uc.constraint_name = ucc1.constraint_name
    and      a.column_name=ucc1.column_name
    and      b.column_name=ucc1.column_name
    and      uc.table_name=a.table_name
    and      uc.table_name=b.table_name
    AND      uc.r_constraint_name = ucc2.constraint_name
    AND      ucc1.POSITION = ucc2.POSITION 
    AND      uc.constraint_type = 'R'
    ORDER BY ucc1.TABLE_NAME
    ,        uc.constraint_name;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 2021-03-27
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 2023-01-18
      • 2013-01-31
      相关资源
      最近更新 更多