2017-08-03 46 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)而不是 –