निम्न तालिका में मान दर्ज करते समय SQL में समान तालिका के स्तंभों पर विदेशी कुंजी की बाधा को कैसे लागू करें:

कर्मचारी:

  • एम्पिड संख्या,
  • प्रबंधक संख्या (मौजूदा कर्मचारी होना चाहिए)
10
pop stack 7 जिंदा 2012, 11:29

3 जवाब

सबसे बढ़िया उत्तर
CREATE TABLE TABLE_NAME (
    `empid_number`    int     (  11) NOT NULL auto_increment,   
    `employee`        varchar ( 100) NOT NULL               ,
    `manager_number`  int     (  11) NOT NULL               ,
     PRIMARY KEY  (`empid_number`),
     CONSTRAINT `manager_references_employee`
     FOREIGN KEY (`manager_number`) REFERENCES (`empid_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

आशा है कि इससे सहायता मिलेगी!

-1
Sled 13 अगस्त 2013, 21:17
कुछ...! ओरेकल के लिए कोई अन्य तरीका/सुझाव?
 – 
pop stack
7 जिंदा 2012, 12:15
मैंने कभी कोशिश नहीं की, लेकिन मुझे लगता है कि "parent_table_name" के बजाय TABLE_NAME देना काम करना चाहिए !!
 – 
instanceOfObject
7 जिंदा 2012, 12:22
4
यह Oracle के लिए मान्य कथन नहीं है
 – 
a_horse_with_no_name
7 जिंदा 2012, 14:40
मैंने MySQL के लिए सुझाव दिया। जैसा कि कहा गया है, मुझे ओरेकल के बारे में कोई जानकारी नहीं है।
 – 
instanceOfObject
7 जिंदा 2012, 17:28
4
आपने Oracle प्रश्न के लिए MySQL-only उत्तर का चयन क्यों किया? आपको इस उत्तर को अचयनित करना चाहिए और बेन द्वारा दूसरे उत्तर का चयन करना चाहिए।
 – 
Sled
13 अगस्त 2013, 21:19

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
 );

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

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

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

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

  1. पता करें कि आप कैसे कर सकते हैं।
  2. अपने डीबी डिज़ाइन को बदलें क्योंकि एफके में एक इंडेक्स होना चाहिए और यदि आपके पास एक नहीं हो सकता है तो एफके शायद जाने का रास्ता नहीं है। हो सकता है कि प्रबंधकों की एक तालिका और कर्मचारियों की एक तालिका हो?
21
Ben 9 जिंदा 2012, 12:42
यह एक समाधान हो सकता है, लेकिन मेरे मामले में, कोई 'ट्रिगर' नहीं, कोई 'परिवर्तन' की अनुमति नहीं है। सरल 'तालिका बनाएं' के बाद 'आवेषण' केवल आवश्यक हैं। अभी?
 – 
pop stack
7 जिंदा 2012, 18:36
@popstack, मेरे पास कहने के लिए बहुत कुछ था इसलिए मैंने उत्तर में एक संपादन जोड़ा।
 – 
Ben
7 जिंदा 2012, 19:14
बहुत यकीन है कि आपको संदर्भ के लिए विदेशी कुंजी बाधा के लिए एक अद्वितीय या विदेशी कुंजी बाधा को परिभाषित करना होगा। और आप हमेशा ON DELETE क्लॉज को छोड़ सकते हैं, जो अन्य RDBMS में ON DELETE RESTRICT क्लॉज के रूप में कार्य करता है, जो चाइल्ड रिकॉर्ड वाले माता-पिता को हटाने से रोकता है।
 – 
Adam Musch
9 जिंदा 2012, 04:14
@AdamMusch, आप निश्चित रूप से पीके के बारे में सही हैं। मैंने जवाब अपडेट कर लिया है। हालांकि मुझे डिलीट के बाद कुछ भी करना पसंद नहीं है; यदि आप नहीं करते हैं तो यह set null पर कोई लाभ नहीं देता है और आपको तालिका में गैर-स्पष्ट रूप से अनाथ रिकॉर्ड के साथ छोड़ देगा।
 – 
Ben
9 जिंदा 2012, 12:43
2
@ बेन: यदि आप Oracle में ON DELETE CASCADE या ON DELETE SET NULL निर्दिष्ट नहीं करते हैं, तो यह आपको माता-पिता को हटाने से रोकेगा, जो गैर-स्पष्ट रूप से अनाथ रिकॉर्ड को पहले स्थान पर फेंकने से रोकता है ORA-02292.
 – 
Adam Musch
9 जिंदा 2012, 19:32

स्वयं संदर्भ प्रश्न...

Alter table table_name ADD constraints constraints_name foreign key(column_name1,column_name2..) references table_name(column_name1,column_name2...) ON DELETE CASCADE;

पूर्व- ALTER TABLE Employee ADD CONSTRAINTS Fr_key( mgr_no) references employee(Emp_no) ON DELETE CASCADE;

1
legrandviking 13 अगस्त 2013, 21:23