तो समस्या यह है कि पदानुक्रम के शीर्ष पर एक उपयोगकर्ता होना चाहिए, एक ऐसा उपयोगकर्ता जिसके लिए कोई प्रबंधक नहीं है (आपके उदाहरण में संपादक)। यही कारण है कि इस तरह की संरचना का क्लासिक समाधान शून्य मानों की अनुमति देना है। आप इसे अपने समापन अनुच्छेद में स्वीकार करते हैं:
किकर है, यदि पहले उपयोगकर्ता के पास निर्माता या संपादक नहीं है तो कोई "अस्थायी" नहीं है:आपको अनिवार्य बाधा को छोड़ना होगा। यदि आप ऐसा करते हैं, तो पुनरावर्ती विदेशी कुंजी बाधा के साथ समस्या गायब हो जाएगी।
विकल्प यह है कि अरस्तू को एक प्राइम मूवर कहा जाता है, एक ऐसा उपयोगकर्ता जिसका निर्माता स्वयं है। इस तालिका को देखते हुए:
create table t72
( userid number not null
, creator number not null
, editor number not null
, constraint t72_pk primary key (userid)
, constraint t72_cr_fk foreign key (creator)
references t72 (userid)
, constraint t72_ed_fk foreign key (editor)
references t72 (userid)
)
/
ऐसा उपयोगकर्ता बनाना बहुत आसान है:
SQL> insert into t72 values (1,1,1)
2 /
1 row created.
SQL> commit;
Commit complete.
SQL>
तो यह विहित समाधान क्यों नहीं है। खैर यह थोड़ा निराला डेटा मॉडल की ओर ले जाता है जो कुछ और उपयोगकर्ताओं को जोड़ने के बाद पदानुक्रमित प्रश्नों के साथ कहर बरपा सकता है।
SQL> select lpad(' ', level-1)|| u.userid as userid
2 , u.name
3 , u.editor
4 from t72 u
5 connect by
6 prior userid = editor
7 start with userid=1
8 /
ERROR:
ORA-01436: CONNECT BY loop in user data
no rows selected
SQL>
मूल रूप से डेटाबेस को USERID का अपना संपादक होना पसंद नहीं है। हालांकि, एक समाधान है, जो NOCYCLE
. है कीवर्ड (10g के साथ पेश किया गया)। यह डेटाबेस को पदानुक्रम में परिपत्र संदर्भों को अनदेखा करने के लिए कहता है:
SQL> select lpad(' ', level-1)|| u.userid as userid
2 , u.name
3 , u.editor
4 from t72 u
5 connect by nocycle
6 prior userid = editor
7 start with userid=1
8 /
USERID NAME EDITOR
---------- ---------- ----------
1 ONE 1
2 TWO 1
3 THREE 2
4 FOUR 2
5 FIVE 2
6 SIX 2
7 SEVEN 6
7 rows selected.
SQL>
यहां कोई फर्क नहीं पड़ता क्योंकि डेटा अभी भी सही ढंग से पदानुक्रमित है। लेकिन अगर हम ऐसा करते हैं तो क्या होगा:
SQL> update t72 set editor = 7
2 where userid = 1
3 /
1 row updated.
SQL>
हम एक रिश्ता खो देते हैं (1 -> 7)। हम CONNECT_BY_ISNOCYCLE छद्म-स्तंभ का उपयोग करके देख सकते हैं कि कौन सी पंक्ति साइकिल चला रही है।
SQL> select lpad(' ', level-1)|| u.userid as userid
2 , u.name
3 , u.editor
4 , connect_by_iscycle
5 from t72 u
6 connect by nocycle
7 prior userid = editor
8 start with userid=1
9 /
USERID NAME EDITOR CONNECT_BY_ISCYCLE
---------- ---------- ---------- ------------------
1 ONE 7 0
2 TWO 1 0
3 THREE 2 0
4 FOUR 2 0
5 FIVE 2 0
6 SIX 2 0
7 SEVEN 6 1
7 rows selected.
SQL>
शुद्ध SQL में पदानुक्रमित डेटा के साथ काम करना आसान बनाने के लिए Oracle में बहुत सारी अतिरिक्त कार्यक्षमता है। यह सब दस्तावेज में है। अधिक जानकारी प्राप्त करें .