Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

अपने लिए विदेशी कुंजी के साथ रेल मॉडल

तो समस्या यह है कि पदानुक्रम के शीर्ष पर एक उपयोगकर्ता होना चाहिए, एक ऐसा उपयोगकर्ता जिसके लिए कोई प्रबंधक नहीं है (आपके उदाहरण में संपादक)। यही कारण है कि इस तरह की संरचना का क्लासिक समाधान शून्य मानों की अनुमति देना है। आप इसे अपने समापन अनुच्छेद में स्वीकार करते हैं:

किकर है, यदि पहले उपयोगकर्ता के पास निर्माता या संपादक नहीं है तो कोई "अस्थायी" नहीं है:आपको अनिवार्य बाधा को छोड़ना होगा। यदि आप ऐसा करते हैं, तो पुनरावर्ती विदेशी कुंजी बाधा के साथ समस्या गायब हो जाएगी।

विकल्प यह है कि अरस्तू को एक प्राइम मूवर कहा जाता है, एक ऐसा उपयोगकर्ता जिसका निर्माता स्वयं है। इस तालिका को देखते हुए:

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 में बहुत सारी अतिरिक्त कार्यक्षमता है। यह सब दस्तावेज में है। अधिक जानकारी प्राप्त करें .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. इस कोड में फ़ील्ड अलग-अलग नाम से कैसे मिल सकते हैं?

  2. ओरेकल में Add_month के साथ समस्या, मुझे बिलिंग चक्र उत्पन्न करने की आवश्यकता है

  3. Oracle में टॉप-एन क्वेरीज़ और पेजिनेशन

  4. HQL क्वेरी में NULL की जाँच कैसे करें या मान्य नहीं है?

  5. NUMBER कॉलम के लिए IN क्लॉज के अंदर अल्पविराम से अलग किए गए मानों का उपयोग करना