यह काफी हद तक प्राथमिक कुंजी और विदेशी कुंजी और क्लॉज जैसे ON DELETE CASCADE
है इसलिए है। यदि बहुत देर नहीं हुई है, तो आप कोई भी विलोपन करने से पहले PK और FK बाधाओं को जोड़ने का प्रयास कर सकते हैं; तब सब कुछ आसान हो जाएगा।
जोड़ा गया :आगे की चर्चा के आधार पर। नीचे दी गई क्वेरी का उपयोग मूल तालिका के सभी वंशज तालिकाओं को खोजने के लिए किया जा सकता है। क्वेरी में शायद कई तरह से सुधार किया जा सकता है, लेकिन यह एक ठीक प्रारंभिक बिंदु हो सकता है।
with f as (
select constraint_name, table_name, r_constraint_name
from user_constraints
where constraint_type = 'R'
),
p as (
select constraint_name, table_name
from user_constraints
where constraint_type = 'P'
),
j (child_table, f_key, parent_table, p_key) as (
select f.table_name, f.constraint_name, p.table_name, f.r_constraint_name
from p join f on p.constraint_name = f.r_constraint_name
union all
select 'EMPLOYEES', (select constraint_name from p
where table_name = 'EMPLOYEES'), null, null from dual
)
select level as lvl, j.*
from j
start with parent_table is null
connect by nocycle parent_table = prior child_table
order by lvl, parent_table, child_table;
इस मामले में "पैरेंट" तालिका कर्मचारी है और नाम एक ही पंक्ति में दो बार प्रकट होता है। जरूरत पड़ने पर इसे बाइंड वेरिएबल में बनाया जा सकता है। मैंने EMPLOYEES का उपयोग किया (ध्यान दें:यह सभी-कैप्स में होना चाहिए क्योंकि इस तरह से सिस्टम टेबल में स्ट्रिंग मान संग्रहीत किए जाते हैं) क्योंकि मैंने इसे मानक HR स्कीमा पर चलाया था; आउटपुट:
LVL CHILD_TABLE F_KEY PARENT_TABLE P_KEY
----- ----------------- -------------------- ----------------- -----------------
1 EMPLOYEES EMP_EMP_ID_PK
2 DEPARTMENTS DEPT_MGR_FK EMPLOYEES EMP_EMP_ID_PK
2 JOB_HISTORY JHIST_EMP_FK EMPLOYEES EMP_EMP_ID_PK
3 JOB_HISTORY JHIST_DEPT_FK DEPARTMENTS DEPT_ID_PK