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