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

एक ही तालिका के स्तंभों के लिए एक विदेशी-कुंजी बाधा लागू करें

Oracle इसे एक स्व-संदर्भित अखंडता बाधा कहते हैं। दस्तावेज़ीकरण यहाँ विवरण के लिए है,

आप एक सेल्फ़-रेफ़रेंशियल बाधा उसी तरह बनाते हैं जैसे आप एक सामान्य बाधा बनाते हैं:

alter table employees
  add constraint employees_emp_man_fk
      foreign key ( manager_no )
      references employees ( emp_id )
   on delete set null
      ;

मैं मान रहा हूँ कि आपका manager_no अशक्त है। मैंने यहां सेट नल को delete cascade . के रूप में जोड़ा है संभवत:आपकी तालिका का एक महत्वपूर्ण हिस्सा मिटा देगा।

मैं ऐसा करने का एक बेहतर तरीका नहीं सोच सकता। किसी प्रबंधक को हटाने का परिणाम उसके सभी कर्मचारियों को नहीं हटाना चाहिए, इसलिए आपको set null और बिना प्रबंधक वाले किसी भी व्यक्ति को आपको सचेत करने के लिए टेबल पर एक ट्रिगर रखें।

मुझे यह साइट हमेशा पसंद है, जो साधारण संदर्भों के लिए अच्छी है। और FK पर भी एक इंडेक्स रखना न भूलें या टॉम आप पर चिल्लाएगा :-)।

क्रिएट टेबल स्टेटमेंट में सेल्फ-रेफरेंशियल FK बनाने के लिए कोई भी मानक Oracle सिंटैक्स का उपयोग कर सकता है, जो निम्न जैसा दिखेगा।

create table employees
 ( emp_id number
 , other_columns ...
 , manager_no number
 , constraint employees_pk 
    primary key (emp_id)
 , constraint employees_man_emp_fk
    foreign key ( manager_no )
    references employees ( emp_id )
    on delete set null
 );

संपादित करें:

नीचे दिए गए @popstack की टिप्पणी के जवाब में:

जबकि आप इसे एक बयान में कर सकते हैं एक तालिका को बदलने में सक्षम नहीं होना काफी हास्यास्पद स्थिति है। आपको निश्चित रूप से उस तालिका का विश्लेषण करना चाहिए जिससे आप चयन करने जा रहे हैं और आप अभी भी विदेशी कुंजी (और संभवतः अधिक कॉलम और/या अधिक अनुक्रमणिका) पर एक अनुक्रमणिका चाहते हैं अन्यथा जब भी आप विदेशी कुंजी का उपयोग करेंगे जो आप करने जा रहे हैं एक पूर्ण तालिका स्कैन। आस्कटॉम के लिए मेरा लिंक ऊपर देखें।

यदि आप किसी तालिका को बदलने में असमर्थ हैं तो आपको महत्व के अवरोही क्रम में करना चाहिए।

  1. जानें कि आप कैसे कर सकते हैं।
  2. अपना डीबी डिज़ाइन बदलें क्योंकि एफके में एक इंडेक्स होना चाहिए और यदि आपके पास एक नहीं हो सकता है तो एफके शायद जाने का रास्ता नहीं है। हो सकता है कि आपके पास प्रबंधकों की तालिका और कर्मचारियों की तालिका हो?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-29285 कैसे हल करें:फ़ाइल लिखने में त्रुटि

  2. sysdate के साथ to_date फ़ंक्शन के साथ समस्या

  3. Oracle में एक ऑटो इंक्रीमेंट प्राथमिक कुंजी को कैसे परिभाषित करें

  4. jpa . में किसी ऑब्जेक्ट को सहेजने से पहले मैं आईडी कैसे जानूं?

  5. क्या .NET में OraOLEDB प्रदाता CLOB फ़ील्ड पर अविश्वसनीय है?