2017-08-03 48 views
0

我想写一个SQL来检查FK'S。我到目前为止:Oracle SQL:外键目标表

SELECT OWNER, 
     CONSTRAINT_TYPE, 
     TABLE_NAME, 
     R_OWNER, 
     R_CONSTRAINT_NAME 
    FROM ALL_CONSTRAINTS 
WHERE  OWNER = 'XXX' 
     AND TABLE_NAME = 'XXX' 
     AND CONSTRAINT_TYPE = 'R' 

问题:我没有看到FK映射到哪里。你有R_OWNER和R_CONSTRAINT_NAME,但没有R_TABLE。无论如何,这可以通过编写SQL来完成吗?

回答

0

更新。

这给你想要的东西:

select 
    cc.owner, 
    cc.constraint_name, 
    cc.table_name, 
    cc.column_name, 
    c.r_owner, 
    c_pk.table_name r_table_name, 
    c_pk.constraint_name r_pk 
from all_cons_columns cc 
join all_constraints c on cc.owner = c.owner and cc.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 cc.owner = 'XXX' 
and cc.table_name = 'XXX'; 
+0

一个问题:加入all_constraints与all_constraints的目的是什么? – Letterdief

+0

那么,你会从同一视图中获得不同的行,以便将它们结合在一起。在相同的查询中使用相同的表或视图是没有什么不寻常的,如果它是为了这个目的的话。 – ZZa

-1

你可以得到所有现有的外键的列表:

  SELECT RC.CONSTRAINT_NAME FK_Name, 
       KF.TABLE_SCHEMA FK_Schema, 
       KF.TABLE_NAME FK_Table, 
       KF.COLUMN_NAME FK_Column, 
       RC.UNIQUE_CONSTRAINT_NAME PK_Name, 
       KP.TABLE_SCHEMA PK_Schema, 
       KP.TABLE_NAME PK_Table, 
       KP.COLUMN_NAME PK_Column, 
       RC.MATCH_OPTION MatchOption, 
       RC.UPDATE_RULE UpdateRule, 
       RC.DELETE_RULE DeleteRule 
     FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS RC 
      JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KF ON RC.CONSTRAINT_NAME = KF.CONSTRAINT_NAME 
      JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KP ON RC.UNIQUE_CONSTRAINT_NAME = KP.CONSTRAINT_NAME; 
+0

有在甲骨文 –

+0

没有'information_schema'在谷歌我已经搜查,其在甲骨文也可用,请参阅链接https://docs.oracle.com /cd/E19078-01/mysql/mysql-refman-5.0/information-schema.html –

+0

不,它不是。不要相信在没有验证的情况下Google上的随机访问。 [阅读手册](http://docs.oracle.com/database/121/REFRN/toc.htm)而不是 –