如何在Oracle中查找具有外键的表的表?

时间:2010-09-20 13:31:32

标签: oracle key

我计划从表中删除数据,我想知道在Oracle中有多少以及哪些表具有对该特定表的外键引用。因为我必须将外键设置为null。我想知道所有具有FK的表的列表。

8 个答案:

答案 0 :(得分:12)

SELECT d.table_name,

       d.constraint_name "Primary Constraint Name",

       b.constraint_name "Referenced Constraint Name"

FROM user_constraints d,

     (SELECT c.constraint_name,

             c.r_constraint_name,

             c.table_name

      FROM user_constraints c 

      WHERE table_name='EMPLOYEES' --your table name instead of EMPLOYEES

      AND constraint_type='R') b

WHERE d.constraint_name=b.r_constraint_name

答案 1 :(得分:10)

SELECT
  FK.OWNER||'.'||FK.TABLE_NAME AS CHILD_TABLE,
  SRC.OWNER||'.'||SRC.TABLE_NAME AS PARENT_TABLE,
  FK.CONSTRAINT_NAME AS FK_CONSTRAINT,
  SRC.CONSTRAINT_NAME AS REFERENCED_CONSTRAINT
FROM ALL_CONSTRAINTS FK
JOIN ALL_CONSTRAINTS SRC ON FK.R_CONSTRAINT_NAME = SRC.CONSTRAINT_NAME
WHERE
  FK.CONSTRAINT_TYPE = 'R'
  AND SRC.OWNER = 'MY_SCHEMA'
  AND SRC.TABLE_NAME = 'MY_TABLE';

我有一种情况,我感兴趣的表格并不是我所连接的架构所拥有的。因此,我需要在currently accepted answer中修改查询,以使用ALL_CONSTRAINTS代替USER_CONSTRAINTS。在这个过程中,我犯了一个错误,我发现接受的答案很难阅读,所以我可以解决它。 (缺乏解释并没有帮助。)结果,我最终提出了自己的问题。它基本相同,但我认为它更容易理解。

FK.CONSTRAINT_TYPE = 'R'向下过滤FK到一组外键约束,并且连接将这些外键与它们的" Referenced约束"配对。 (引用的约束通常是" parent"表的主键。)最后,我们过滤到我们对使用SRC.OWNER = 'MY_SCHEMA' AND SRC.TABLE_NAME = 'MY_TABLE'感兴趣的父表。

当然,如果您愿意,可以将其切换为使用USER_CONSTRAINTS;只需删除SRC.OWNER中的OWNER支票和SELECT前缀。

答案 2 :(得分:6)

下面的查询将给出在TABLE_NAME上定义的所有外键约束:

select baseTable.* from all_constraints baseTable , all_constraints referentedTable 
    where baseTable.R_CONSTRAINT_NAME = referentedTable.CONSTRAINT_NAME
    and baseTable.constraint_type = 'R'
    and referentedTable.table_name = 'TABLE_NAME';

答案 3 :(得分:1)

如果您还需要包含字段:

select b.table_name      "Referencing Table", 
       b.CONSTRAINT_NAME "Referencing Constraint",
       (select wm_concat(column_name)
          from all_cons_columns
         where owner = b.owner
           and constraint_name = b.CONSTRAINT_NAME
       ) "Referencing Columns",
       a.CONSTRAINT_NAME         "Referenced Constraint",
       (select wm_concat(column_name)
          from all_cons_columns
         where owner = a.owner
           and constraint_name = a.CONSTRAINT_NAME
       ) "Referenced columns"
  from all_constraints a,
       all_constraints b
 where a.owner = b.r_owner
   and a.owner = '<<OWNER>>'
   and a.table_name = '<<TABLE_NAME>>'
   and a.constraint_type in ('P', 'U')
   and b.constraint_type = 'R'
   and b.R_CONSTRAINT_NAME = a.constraint_name

答案 4 :(得分:0)

无需手动执行此步骤 - 您只需使用cascading delete

答案 5 :(得分:0)

SELECT a.table_name, a.column_name, a.constraint_name, c.owner, 
       -- referenced pk
       c.r_owner, c_pk.table_name r_table_name, c_pk.constraint_name r_pk
  FROM all_cons_columns a
  JOIN all_constraints c ON a.owner = c.owner
                        AND a.constraint_name = c.constraint_name
  JOIN all_constraints c_pk ON c.r_owner = c_pk.owner
                           AND c.r_constraint_name = c_pk.constraint_name
 WHERE c.constraint_type = 'R'
   AND a.table_name = :TableName

答案 6 :(得分:0)

也许我误解了Walker所问的内容,但我理解的是:如何查找具有特定表的外键引用的表(例如:EMPLOYEES)。

如果我尝试Kupa的回答:

select d.table_name,
       d.constraint_name "Primary Constraint Name",
       b.constraint_name "Referenced Constraint Name"

from user_constraints d,

     (select c.constraint_name,
             c.r_constraint_name,
             c.table_name
      from user_constraints c 
      where table_name='EMPLOYEES' --your table name instead of EMPLOYEES
      and constraint_type='R') b

where d.constraint_name=b.r_constraint_name

我得到了EMPLOYEES有外键引用的表。

EMPLOYEES.foreign_key =&gt; TABLES.primary_key

请参阅下面更新的sql以检索具有EMPLOYEES外键引用的表。

TABLES.foreign_key =&gt; EMPLOYEES.primary_key

select b.table_name "Table Name",
   b.constraint_name "Constraint Name",
   d.table_name "Referenced Table Name",
   d.constraint_name "Referenced Constraint Name"

from user_constraints d,

 (select c.constraint_name,
         c.r_constraint_name,
         c.table_name
  from user_constraints c
  where constraint_type='R') b

where d.table_name = 'EMPLOYEES' --your table name instead of EMPLOYEES
and b.r_constraint_name = d.constraint_name;

答案 7 :(得分:0)

SELECT CONSTRAINT_NAME from ALL_CONSTRAINTS WHERE OWNER= sys_context('userenv','current_schema') AND CONSTRAINT_TYPE='R';