बाह्‌य कुंजी (फॉरेन की)

एक विदेशी कुंजी एक तालिका में विशेषताओं का एक सेट है जो किसी अन्य तालिका की प्राथमिक कुंजी को संदर्भित करती है। विदेशी कुंजी इन दो तालिकाओं को जोड़ती है। इसे रखने का दूसरा तरीका: संबंधपरक डेटाबेस के संदर्भ में, एक विदेशी कुंजी एक निश्चित प्रकार की समावेशन निर्भरता बाधाओं के अधीन विशेषताओं का एक सेट है, विशेष रूप से एक बाधा जिसमें एक संबंध में विदेशी कुंजी विशेषता (कंप्यूटिंग) शामिल टपल है ( डेटाबेस), R, कुछ अन्य (आवश्यक रूप से अलग नहीं) संबंध, S में भी मौजूद होना चाहिए, और इसके अलावा उन विशेषताओं को S में एक उम्मीदवार कुंजी भी होना चाहिए। सरल शब्दों में, एक विदेशी कुंजी उन विशेषताओं का एक समूह है जो उम्मीदवार कुंजी का संदर्भ देती है। उदाहरण के लिए, TEAM नामक तालिका में एक विशेषता MEMBER_NAME हो सकती है, जो कि PERSON तालिका में उम्मीदवार कुंजी, PERSON_NAME को संदर्भित करने वाली एक विदेशी कुंजी है। चूंकि MEMBER_NAME एक विदेशी कुंजी है, TEAM में किसी सदस्य के नाम के रूप में मौजूद कोई भी मान PERSON तालिका में किसी व्यक्ति के नाम के रूप में भी मौजूद होना चाहिए; दूसरे शब्दों में, टीम का प्रत्येक सदस्य भी एक व्यक्ति होता है।

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

चूंकि विदेशी कुंजी का उद्देश्य संदर्भित तालिका की एक विशेष पंक्ति की पहचान करना है, आम तौर पर यह आवश्यक है कि विदेशी कुंजी प्राथमिक तालिका की कुछ पंक्ति में उम्मीदवार कुंजी के बराबर हो, अन्यथा इसका कोई मूल्य नहीं है (शून्य (एसक्यूएल) कीमत। ). इस नियम को दो तालिकाओं के बीच संदर्भित अखंडता कहा जाता है। क्योंकि इन बाधाओं का उल्लंघन कई डेटाबेस समस्याओं का स्रोत हो सकता है, अधिकांश डेटाबेस प्रबंधन प्रणालियां यह सुनिश्चित करने के लिए तंत्र प्रदान करती हैं कि प्रत्येक गैर-शून्य विदेशी कुंजी संदर्भित तालिका की एक पंक्ति से मेल खाती है। उदाहरण के लिए, दो तालिकाओं वाले एक डेटाबेस पर विचार करें: एक ग्राहक तालिका जिसमें सभी ग्राहक डेटा और एक ऑर्डर तालिका शामिल होती है जिसमें सभी ग्राहक आदेश शामिल होते हैं। मान लीजिए कि व्यवसाय के लिए आवश्यक है कि प्रत्येक आदेश एक ग्राहक को संदर्भित करे। डेटाबेस में इसे दर्शाने के लिए, ORDER टेबल (जैसे, CUSTOMERID) में एक विदेशी कुंजी कॉलम जोड़ा जाता है, जो CUSTOMER (जैसे ID) की प्राथमिक कुंजी को संदर्भित करता है। क्योंकि किसी तालिका की प्राथमिक कुंजी अद्वितीय होनी चाहिए, और क्योंकि CUSTOMERID में केवल उस प्राथमिक कुंजी फ़ील्ड के मान होते हैं, हम मान सकते हैं कि, जब इसका कोई मान होगा, तो CUSTOMERID उस विशेष ग्राहक की पहचान करेगा जिसने आदेश दिया था। हालाँकि, यह अब नहीं माना जा सकता है यदि ग्राहक तालिका की पंक्तियों को हटा दिए जाने या आईडी कॉलम को बदल दिए जाने पर ORDER तालिका को अद्यतित नहीं रखा जाता है, और इन तालिकाओं के साथ काम करना अधिक कठिन हो सकता है। कई वास्तविक दुनिया डेटाबेस इस समस्या के आसपास काम करते हैं, मास्टर टेबल विदेशी कुंजियों को भौतिक रूप से हटाने के बजाय 'निष्क्रिय' करके, या जटिल अद्यतन कार्यक्रमों द्वारा जो किसी परिवर्तन की आवश्यकता होने पर विदेशी कुंजी के सभी संदर्भों को संशोधित करते हैं।

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

इसके अलावा, चाइल्ड और पैरेंट टेबल वास्तव में एक ही टेबल हो सकती है, यानी विदेशी कुंजी उसी टेबल को संदर्भित करती है। ऐसी विदेशी कुंजी को SQL:2003 में स्व-संदर्भित या पुनरावर्ती विदेशी कुंजी के रूप में जाना जाता है। डेटाबेस प्रबंधन प्रणालियों में, यह अक्सर एक ही तालिका के पहले और दूसरे संदर्भ को जोड़कर पूरा किया जाता है।

एक तालिका में कई विदेशी कुंजियाँ हो सकती हैं, और प्रत्येक विदेशी कुंजी की एक अलग मूल तालिका हो सकती है। प्रत्येक विदेशी कुंजी को डेटाबेस सिस्टम द्वारा स्वतंत्र रूप से लागू किया जाता है। इसलिए, विदेशी कुंजियों का उपयोग करके तालिकाओं के बीच कैस्केडिंग संबंध स्थापित किए जा सकते हैं।

एक विदेशी कुंजी को एक संबंध में एक विशेषता या विशेषताओं के सेट के रूप में परिभाषित किया जाता है जिसका मूल्य किसी अन्य संबंध में प्राथमिक कुंजी से मेल खाता है। किसी मौजूदा तालिका में ऐसी बाधा जोड़ने के लिए सिंटैक्स SQL:2003 में परिभाषित किया गया है जैसा कि नीचे दिखाया गया है। में कॉलम सूची को छोड़ना  खंड का अर्थ है कि विदेशी कुंजी संदर्भित तालिका की प्राथमिक कुंजी को संदर्भित करेगी। इसी तरह, विदेशी कुंजी को के हिस्से के रूप में परिभाषित किया जा सकता है  एसक्यूएल बयान।

<वाक्यविन्यास लैंग = एसक्यूएल> टेबल बनाएं चाइल्ड_टेबल ( col1 पूर्णांक प्राथमिक कुंजी,  col2 वर्ण भिन्न (20),  col3 पूर्णांक,  col4 पूर्णांक,  विदेशी कुंजी (col3, col4) DELETE CASCADE पर संदर्भ parent_table (col1, col2) ) 

यदि विदेशी कुंजी केवल एक स्तंभ है, तो निम्न सिंटैक्स का उपयोग करके स्तंभ को इस तरह चिह्नित किया जा सकता है:

<वाक्यविन्यास लैंग = एसक्यूएल> टेबल बनाएं चाइल्ड_टेबल ( col1 पूर्णांक प्राथमिक कुंजी,  col2 वर्ण भिन्न (20),  col3 पूर्णांक,  col4 इंटेगर DELETE CASCADE पर parent_table(col1) का संदर्भ देता है ) 

विदेशी कुंजियों को एक संग्रहीत कार्यविधि विवरण के साथ परिभाषित किया जा सकता है।

<वाक्यविन्यास लैंग = एसक्यूएल> sp_foreignkey Child_table, parent_table, col3, col4 


 * चाइल्ड_टेबल: तालिका या दृश्य का नाम जिसमें परिभाषित की जाने वाली विदेशी कुंजी है।
 * पेरेंट_टेबल: तालिका या दृश्य का नाम जिसमें प्राथमिक कुंजी होती है, जिस पर विदेशी कुंजी लागू होती है। प्राथमिक कुंजी पहले से ही परिभाषित होनी चाहिए।
 * col3 और col4: विदेशी कुंजी बनाने वाले स्तंभों का नाम। विदेशी कुंजी में कम से कम एक कॉलम और अधिकतम आठ कॉलम होने चाहिए।

संदर्भित क्रियाएं
क्योंकि डेटाबेस प्रबंधन प्रणाली संदर्भित बाधाओं को लागू करती है, यदि संदर्भित तालिका में पंक्तियों को हटाया जाना (या अद्यतन) किया जाना है, तो उसे डेटा अखंडता सुनिश्चित करनी चाहिए। यदि संदर्भ तालिका में आश्रित पंक्तियाँ अभी भी मौजूद हैं, तो उन संदर्भों पर विचार किया जाना चाहिए। SQL:2003 ऐसी घटनाओं में होने वाली 5 अलग-अलग रेफ़रेंशियल क्रियाओं को निर्दिष्ट करता है:
 * #कैस्केड
 * #प्रतिबंध लगाना
 * #कोई कार्रवाई नहीं
 * # सेट न्यूल
 * # सेट नल, सेट डिफॉल्ट

कैस्केड
जब भी माता-पिता (संदर्भित) तालिका में पंक्तियों को हटा दिया जाता है (या अपडेट किया जाता है), मेल खाने वाली विदेशी कुंजी कॉलम वाली चाइल्ड (संदर्भित) तालिका की संबंधित पंक्तियां भी हटा दी जाएंगी (या अपडेट की जाएंगी)। इसे कैस्केड डिलीट (या अपडेट) कहा जाता है।

प्रतिबंधित करें
जब संदर्भित तालिका में मान को संदर्भित करने वाली सन्दर्भित या चाइल्ड तालिका में कोई पंक्ति मौजूद होती है, तो मान को अद्यतन या हटाया नहीं जा सकता है।

इसी तरह, एक पंक्ति को तब तक हटाया नहीं जा सकता जब तक कि संदर्भ या बाल तालिका से इसका कोई संदर्भ न हो।

RESTRICT (और CASCADE) को बेहतर ढंग से समझने के लिए, निम्नलिखित अंतर पर ध्यान देना मददगार हो सकता है, जो शायद तुरंत स्पष्ट न हो। संदर्भित क्रिया CASCADE उस (चाइल्ड) तालिका के व्यवहार को ही संशोधित करती है जहाँ CASCADE शब्द का उपयोग किया जाता है। उदाहरण के लिए, ON DELETE CASCADE प्रभावी रूप से कहता है जब संदर्भित पंक्ति को अन्य तालिका (मास्टर टेबल) से हटा दिया जाता है, तो मुझसे भी हटा दें। हालाँकि, रेफ़रेंशियल एक्शन RESTRICT मास्टर टेबल के व्यवहार को संशोधित करता है, चाइल्ड टेबल को नहीं, हालाँकि RESTRICT शब्द चाइल्ड टेबल में दिखाई देता है न कि मास्टर टेबल में! इसलिए, DELETE RESTRICT प्रभावी रूप से कहता है: जब कोई अन्य तालिका (मास्टर तालिका) से पंक्ति को हटाने का प्रयास करता है, तो उस अन्य तालिका से विलोपन को रोकें (और निश्चित रूप से, मुझसे भी न हटाएं, लेकिन यह यहां मुख्य बिंदु नहीं है ).

RESTRICT Microsoft SQL 2012 और पहले के द्वारा समर्थित नहीं है।

कोई कार्रवाई नहीं
कोई कार्रवाई नहीं और प्रतिबंध बहुत हद तक एक जैसे हैं। NO ACTION और RESTRICT के बीच मुख्य अंतर यह है कि NO ACTION के साथ तालिका को बदलने की कोशिश करने के बाद संदर्भित अखंडता जांच की जाती है। अद्यतन (एसक्यूएल) या हटाएं (एसक्यूएल) कथन को निष्पादित करने का प्रयास करने से पहले रेस्ट्रिक्ट चेक करता है। यदि संदर्भात्मक अखंडता जाँच विफल हो जाती है, तो दोनों संदर्भित क्रियाएँ समान कार्य करती हैं: UPDATE या DELETE कथन के परिणामस्वरूप त्रुटि होगी।

दूसरे शब्दों में, जब रेफ़रेंशियल एक्शन NO ACTION का उपयोग करके संदर्भित तालिका पर एक UPDATE या DELETE स्टेटमेंट निष्पादित किया जाता है, तो DBMS स्टेटमेंट निष्पादन के अंत में सत्यापित करता है कि किसी भी रेफ़रेंशियल संबंध का उल्लंघन नहीं हुआ है। यह RESTRICT से अलग है, जो शुरुआत में मानता है कि ऑपरेशन बाधा का उल्लंघन करेगा। NO ACTION का उपयोग करते हुए, डेटाबेस ट्रिगर या स्टेटमेंट के सिमेंटिक्स से ही एक अंतिम स्थिति उत्पन्न हो सकती है जिसमें किसी भी विदेशी कुंजी संबंध का उल्लंघन तब तक नहीं होता है जब तक कि बाधा को अंत में चेक नहीं किया जाता है, इस प्रकार स्टेटमेंट को सफलतापूर्वक पूरा करने की अनुमति देता है।

सेट नल, सेट डिफ़ॉल्ट
सामान्य तौर पर, SET NULL या SET DEFAULT के लिए DBMS द्वारा की गई कार्रवाई DELETE या ON UPDATE दोनों के लिए समान होती है: प्रभावित संदर्भ विशेषताओं का मान SET NULL के लिए NULL और SET DEFAULT के लिए निर्दिष्ट डिफ़ॉल्ट मान में बदल जाता है।.

ट्रिगर
रेफ़रेंशियल कार्रवाइयाँ आम तौर पर निहित डेटाबेस ट्रिगर के रूप में लागू की जाती हैं (अर्थात सिस्टम-जनित नामों के साथ ट्रिगर, अक्सर छिपे हुए।) इस प्रकार, वे उपयोगकर्ता-परिभाषित ट्रिगर्स के समान सीमाओं के अधीन होते हैं, और अन्य ट्रिगर्स के सापेक्ष उनके निष्पादन के क्रम की आवश्यकता हो सकती है। माना जा रहा है; कुछ मामलों में उचित निष्पादन आदेश सुनिश्चित करने के लिए, या म्यूटिंग-टेबल सीमाओं के आसपास काम करने के लिए रेफ़रेंशियल एक्शन को उसके समकक्ष उपयोगकर्ता-परिभाषित ट्रिगर के साथ बदलना आवश्यक हो सकता है।

अलगाव (डेटाबेस सिस्टम) के साथ एक और महत्वपूर्ण सीमा दिखाई देती है: पंक्ति में आपके परिवर्तन पूरी तरह से कैस्केड करने में सक्षम नहीं हो सकते हैं क्योंकि पंक्ति को डेटा द्वारा संदर्भित किया जाता है जिसे आपका लेनदेन नहीं देख सकता है, और इसलिए कैस्केड नहीं कर सकता। एक उदाहरण: जब आपका लेन-देन किसी ग्राहक खाते को फिर से क्रमांकित करने का प्रयास कर रहा है, तो एक साथ किया गया लेन-देन उसी ग्राहक के लिए एक नया चालान बनाने का प्रयास कर रहा है; जबकि एक कैस्केड नियम उन सभी चालान पंक्तियों को ठीक कर सकता है जिन्हें आपका लेन-देन देख सकता है ताकि उन्हें फिर से क्रमांकित ग्राहक पंक्ति के अनुरूप रखा जा सके, यह डेटा को ठीक करने के लिए किसी अन्य लेनदेन में नहीं पहुंचेगा; क्योंकि जब दो लेन-देन प्रतिबद्ध होते हैं तो डेटाबेस लगातार डेटा की गारंटी नहीं दे सकता है, उनमें से एक को वापस रोल करने के लिए मजबूर किया जाएगा (अक्सर पहले आओ-पहले पाओ के आधार पर।)

<वाक्यविन्यास लैंग = एसक्यूएल> तालिका खाता बनाएं (acct_num INT, राशि DECIMAL(10,2));

खाते में डालने से पहले TRIGGER ins_sum बनाएँ प्रत्येक पंक्ति सेट के लिए @sum = @sum + NEW.amount; 

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

आपूर्तिकर्ता (आपूर्तिकर्ता संख्या, नाम, पता) चालान (चालान संख्या, पाठ, आपूर्तिकर्ता संख्या)

संबंधित डेटा परिभाषा भाषा स्टेटमेंट इस प्रकार है। <वाक्यविन्यास लैंग = एसक्यूएल> तालिका प्रदायक बनाएं ( प्रदायक संख्या पूर्णांक शून्य नहीं है,  नाम VARCHAR(20) NULL नहीं,  पता VARCHAR(50) NULL नहीं,  बाधा आपूर्तिकर्ता_पीके प्राथमिक कुंजी (आपूर्तिकर्ता संख्या),  बाधा संख्या_मूल्य जांच (आपूर्तिकर्ता संख्या> 0) )

तालिका चालान बनाएँ ( चालान संख्या पूर्णांक नहीं है,  टेक्स्ट वर्चर (4096),  प्रदायक संख्या पूर्णांक शून्य नहीं है,  बाधा चालान_pk प्राथमिक कुंजी (चालान संख्या),  CONSTRAINT inumber_value चेक (इनवॉइसनंबर > 0),  बाधा आपूर्तिकर्ता_fk    विदेशी कुंजी (आपूर्तिकर्ता संख्या) संदर्भ आपूर्तिकर्ता (आपूर्तिकर्ता संख्या)    डिलीट रेस्ट्रिक्ट पर अपडेट कैस्केड पर ) 

यह भी देखें

 * उम्मीदवार कुंजी
 * यौगिक कुंजी
 * सुपरकी
 * जंक्शन टेबल

बाहरी संबंध

 * SQL-99 Foreign Keys
 * PostgreSQL Foreign Keys
 * MySQL Foreign Keys
 * FirebirdSQL primary Keys
 * SQLite support for Foreign Keys
 * Microsoft SQL 2012 table_constraint (Transact-SQL)

Schlüssel (Datenbank) Nøkkel (database)