主鍵和外來鍵

space6212發表於2019-07-20

前段時間發連連一個查詢資料庫主外來鍵關係的文章(http://space6212.itpub.net/post/12157/107584),但有個缺點:不能一目瞭然地檢視多層級聯關係,故今天根據以前對sql作了一些改進,以樹狀結構顯式多層級聯關係,這對於處理設定了級聯刪除的表非常有用


SQL> select distinct * from (select ltrim(sys_connect_by_path(pk_table||'('||pk_col||')','->'),'->') pk_fk from (
2 select
3 pk_table,
4 fk_table,
5 pk_col
6 from
7 (select
8 a.constraint_name pk_con,
9 a.table_name pk_table,b.column_name pk_col,
10 a.owner pk_owner
11 from user_constraints a,user_cons_columns b
12 where (a.constraint_type='P' or a.constraint_type='U')
13 and a.constraint_name=b.constraint_name
14 and a.owner=b.owner) pk,
15 (select c.constraint_name fk_con,
16 c.table_name fk_table,
17 d.column_name fk_col,
18 c.R_OWNER r_pk_owner,
19 c.R_CONSTRAINT_NAME r_pk_con,
20 c.owner fk_owner
21 from user_constraints c,user_cons_columns d
22 where c.constraint_type='R'
23 and c.constraint_name=d.constraint_name
24 and c.owner=d.owner) fk
25 where
26 pk.pk_owner=fk.r_pk_owner(+)
27 and pk.pk_con=fk.r_pk_con(+)
28 order by pk.pk_con
29 )
30 connect by prior fk_table=pk_table ) t where instr(pk_fk,'->')>0 order by 1
31 ;

PK_FK
--------------------------------------------------------------------------------
T1(ID)->T2(NEWT2ID)
T1(ID)->T2(NEWT2ID)->T3(ID)
T1(ID)->T3(ID)
T2(NEWT2ID)->T3(ID)

由於在9i中sys_connect_by_path函式不能處理有迴圈對記錄集,故本例子只適合不會迴圈關聯的表(如引用自身表的外來鍵)

10g中sys_connect_by_path加入了對迴圈情況對處理,等手頭有了10g環境再測試一下

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/231499/viewspace-63709/,如需轉載,請註明出處,否則將追究法律責任。

相關文章