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

From Vigyanwiki
(Created page with "एक विदेशी कुंजी एक तालिका में विशेषताओं का एक सेट है जो किसी अन्य त...")
 
No edit summary
 
(13 intermediate revisions by 5 users not shown)
Line 1: Line 1:
एक विदेशी कुंजी एक तालिका में विशेषताओं का एक सेट है जो किसी अन्य तालिका की [[प्राथमिक कुंजी]] को संदर्भित करती है। विदेशी कुंजी इन दो तालिकाओं को जोड़ती है। इसे रखने का दूसरा तरीका: संबंधपरक डेटाबेस के संदर्भ में, एक विदेशी कुंजी एक निश्चित प्रकार की [[समावेशन निर्भरता]] बाधाओं के अधीन विशेषताओं का एक सेट है, विशेष रूप से एक बाधा जिसमें एक संबंध में विदेशी कुंजी [[विशेषता (कंप्यूटिंग)]] शामिल [[टपल]] है ( डेटाबेस), R, कुछ अन्य (आवश्यक रूप से अलग नहीं) संबंध, S में भी मौजूद होना चाहिए, और इसके अलावा उन विशेषताओं को S में एक [[उम्मीदवार कुंजी]] भी होना चाहिए।<ref>{{cite book|last=Coronel|first=Carlos|title=Database Systems: Design, Implementation, and Management|year=2010|publisher=South-Western/Cengage Learning|location=Independence KY|isbn=978-0-538-74884-1|page=65}}</ref><ref name=elmasri>{{cite book|last=Elmasri|first=Ramez|title=Fundamentals of Database Systems|url=https://archive.org/details/fundamentalsdata00elma|url-access=limited|year=2011|publisher=Addison-Wesley|isbn=978-0-13-608620-8|pages=[https://archive.org/details/fundamentalsdata00elma/page/n101 73]–74}}</ref><ref>{{cite book|last=Date|first=C. J.|title=A guide to the SQL standard|year=1996|publisher=Addison-Wesley|isbn=978-0201964264|page=206}}</ref> सरल शब्दों में, एक विदेशी कुंजी उन विशेषताओं का एक समूह है जो उम्मीदवार कुंजी का संदर्भ देती है। उदाहरण के लिए, TEAM नामक तालिका में एक विशेषता MEMBER_NAME हो सकती है, जो कि PERSON तालिका में उम्मीदवार कुंजी, PERSON_NAME को संदर्भित करने वाली एक विदेशी कुंजी है। चूंकि MEMBER_NAME एक विदेशी कुंजी है, TEAM में किसी सदस्य के नाम के रूप में मौजूद कोई भी मान PERSON तालिका में किसी व्यक्ति के नाम के रूप में भी मौजूद होना चाहिए; दूसरे शब्दों में, टीम का प्रत्येक सदस्य भी एक व्यक्ति होता है।
'''बाह्‌य कुंजी (फॉरेन की)''' तालिका में विशेषताओं का एक समुच्चय है जो किसी अन्य तालिका की [[प्राथमिक कुंजी]] को संदर्भित करती है। बाह्‌य कुंजी इन दो तालिकाओं को जोड़ने का काम करती है। इसे रखने का दूसरा तरीका: संबंधपरक [[डेटाबेस]] के संदर्भ में, एक विदेशी कुंजी एक निश्चित प्रकार की समावेशन निर्भरता बाधा के अधीन विशेषताओं का एक सेट है, विशेष रूप से एक बाधा जो किसी संबंध में विदेशी कुंजी [[विशेषता (कंप्यूटिंग)]] वाले टपल, आर में कुछ अन्य संबंध होने चाहिए एस में भी उपस्थित होना चाहिए, और इसके अलावा उन सुविधाओं को भी एस में कैंडिडेट कुंजी होना चाहिए।<ref>{{cite book|last=Coronel|first=Carlos|title=Database Systems: Design, Implementation, and Management|year=2010|publisher=South-Western/Cengage Learning|location=Independence KY|isbn=978-0-538-74884-1|page=65}}</ref><ref name=elmasri>{{cite book|last=Elmasri|first=Ramez|title=Fundamentals of Database Systems|url=https://archive.org/details/fundamentalsdata00elma|url-access=limited|year=2011|publisher=Addison-Wesley|isbn=978-0-13-608620-8|pages=[https://archive.org/details/fundamentalsdata00elma/page/n101 73]–74}}</ref><ref>{{cite book|last=Date|first=C. J.|title=A guide to the SQL standard|year=1996|publisher=Addison-Wesley|isbn=978-0201964264|page=206}}</ref> सरल शब्दों में, बाह्‌य कुंजी उन विशेषताओं का एक समूह है जो कैंडिडेट कुंजी को संदर्भ देती है। उदाहरण के लिए, टीम नामक तालिका में एक विशेषता मेंबर_नेम हो सकती है, जो कि पर्सन तालिका में कैंडिडेट कुंजी, पर्सन_नेम को संदर्भित करने वाली एक बाह्‌य कुंजी है। चूंकि मेंबर_नेम एक बाह्‌य कुंजी है, टीम में किसी सदस्य के नाम के रूप में उपस्थितकोई भी मान पर्सन तालिका में किसी व्यक्ति के नाम के रूप में भी उपस्थितहोना चाहिए; दूसरे शब्दों में, '''टीम''' का प्रत्येक सदस्य भी एक '''व्यक्ति''' होता है।  


== सारांश ==
== सारांश ==
विदेशी कुंजी वाली तालिका को चाइल्ड टेबल कहा जाता है, और उम्मीदवार कुंजी वाली तालिका को संदर्भित या मूल तालिका कहा जाता है।<ref>{{cite book|last=Sheldon|first=Robert|title=Beginning MySQL|year=2005|publisher=John Wiley & Sons|isbn=0-7645-7950-9|pages=119–122}}</ref> डेटाबेस रिलेशनल मॉडलिंग और कार्यान्वयन में, एक उम्मीदवार कुंजी शून्य या अधिक विशेषताओं का एक सेट है, जिसके मान संबंध में प्रत्येक टपल (पंक्ति) के लिए अद्वितीय होने की गारंटी है। किसी भी टपल के लिए कैंडिडेट की मुख्य विशेषताओं के मूल्यों का संयोजन या संयोजन उस संबंध में किसी अन्य टपल के लिए डुप्लिकेट नहीं किया जा सकता है।
बाह्‌य कुंजी वाली तालिका को चाइल्ड तालिका कहा जाता है, और कैंडिडेट कुंजी वाली तालिका को संदर्भित या मूल तालिका कहा जाता है।<ref>{{cite book|last=Sheldon|first=Robert|title=Beginning MySQL|year=2005|publisher=John Wiley & Sons|isbn=0-7645-7950-9|pages=119–122}}</ref> डेटाबेस रिलेशनल मॉडलिंग और कार्यान्वयन में, एक कैंडिडेट कुंजी शून्य या अधिक विशेषताओं का एक समुच्चय है, जिसके मान संबंध में प्रत्येक टपल (रो) के लिए अद्वितीय होने की गारंटी है। किसी भी टपल के लिए कैंडिडेट की मुख्य विशेषताओं के मूल्यों का संयोजन या संयोजन उस संबंध में किसी अन्य टपल के लिए डुप्लिकेट नहीं किया जा सकता है।


चूंकि विदेशी कुंजी का उद्देश्य संदर्भित तालिका की एक विशेष पंक्ति की पहचान करना है, आम तौर पर यह आवश्यक है कि विदेशी कुंजी प्राथमिक तालिका की कुछ पंक्ति में उम्मीदवार कुंजी के बराबर हो, अन्यथा इसका कोई मूल्य नहीं है ([[शून्य (एसक्यूएल)]] कीमत।<ref name=elmasri />). इस नियम को दो तालिकाओं के बीच संदर्भित अखंडता कहा जाता है।<ref>{{Cite web
चूंकि बाह्‌य कुंजी का उद्देश्य संदर्भित तालिका की एक विशेष पंक्ति की पहचान करना है, सामान्य रूप में यह आवश्यक है कि बाह्‌य कुंजी प्राथमिक तालिका की कुछ पंक्ति में कैंडिडेट कुंजी के बराबर हो, अन्यथा इसका कोई मूल्य शून्य है।<ref name=elmasri />). इस नियम को दो तालिकाओं के बीच संदर्भित अखंडता कहा जाता है।<ref>{{Cite web
   | url = http://www.visualcase.com/kbase/database_basics_-_foreign_keys.htm
   | url = http://www.visualcase.com/kbase/database_basics_-_foreign_keys.htm
   | title = Database Basics&nbsp;— Foreign Keys
   | title = Database Basics&nbsp;— Foreign Keys
   | access-date = 2010-03-13
   | access-date = 2010-03-13
}}</ref>
}}</ref>क्योंकि इन बाधाओं का उल्लंघन कई डेटाबेस समस्याओं का स्रोत हो सकता है, अधिकांश डेटाबेस प्रबंधन प्रणालियां यह सुनिश्चित करने के लिए तंत्र प्रदान करती हैं कि प्रत्येक गैर-शून्य बाह्‌य कुंजी संदर्भित तालिका की एक पंक्ति से मेल खाती है।<ref>{{cite book|last=MySQL AB|title=MySQL Administrator's Guide and Language Reference|year=2006|publisher=Sams Publishing|isbn=0-672-32870-4|page=40}}</ref><ref>{{cite book|last=Powell|first=Gavin|title=Oracle SQL: Jumpstart with Examples|url=https://archive.org/details/oraclesqljumpsta00powe|url-access=limited|year=2004|publisher=Elsevier|asin= B008IU3AHY|page=[https://archive.org/details/oraclesqljumpsta00powe/page/n41 11]}}</ref><ref>{{cite book|last=Mullins|first=Craig|title=DB2 developer's guide|year=2012|publisher=IBM Press|asin=B007Y6K9TK}}</ref>
क्योंकि इन बाधाओं का उल्लंघन कई डेटाबेस समस्याओं का स्रोत हो सकता है, अधिकांश डेटाबेस प्रबंधन प्रणालियां यह सुनिश्चित करने के लिए तंत्र प्रदान करती हैं कि प्रत्येक गैर-शून्य विदेशी कुंजी संदर्भित तालिका की एक पंक्ति से मेल खाती है।<ref>{{cite book|last=MySQL AB|title=MySQL Administrator's Guide and Language Reference|year=2006|publisher=Sams Publishing|isbn=0-672-32870-4|page=40}}</ref><ref>{{cite book|last=Powell|first=Gavin|title=Oracle SQL: Jumpstart with Examples|url=https://archive.org/details/oraclesqljumpsta00powe|url-access=limited|year=2004|publisher=Elsevier|asin= B008IU3AHY|page=[https://archive.org/details/oraclesqljumpsta00powe/page/n41 11]}}</ref><ref>{{cite book|last=Mullins|first=Craig|title=DB2 developer's guide|year=2012|publisher=IBM Press|asin=B007Y6K9TK}}</ref>
 
उदाहरण के लिए, दो तालिकाओं वाले एक डेटाबेस पर विचार करें: एक ग्राहक तालिका जिसमें सभी ग्राहक डेटा और एक ऑर्डर तालिका शामिल होती है जिसमें सभी ग्राहक आदेश शामिल होते हैं। मान लीजिए कि व्यवसाय के लिए आवश्यक है कि प्रत्येक आदेश एक ग्राहक को संदर्भित करे। डेटाबेस में इसे दर्शाने के लिए, ORDER टेबल (जैसे, CUSTOMERID) में एक विदेशी कुंजी कॉलम जोड़ा जाता है, जो CUSTOMER (जैसे ID) की प्राथमिक कुंजी को संदर्भित करता है। क्योंकि किसी तालिका की प्राथमिक कुंजी अद्वितीय होनी चाहिए, और क्योंकि CUSTOMERID में केवल उस प्राथमिक कुंजी फ़ील्ड के मान होते हैं, हम मान सकते हैं कि, जब इसका कोई मान होगा, तो CUSTOMERID उस विशेष ग्राहक की पहचान करेगा जिसने आदेश दिया था। हालाँकि, यह अब नहीं माना जा सकता है यदि ग्राहक तालिका की पंक्तियों को हटा दिए जाने या आईडी कॉलम को बदल दिए जाने पर ORDER तालिका को अद्यतित नहीं रखा जाता है, और इन तालिकाओं के साथ काम करना अधिक कठिन हो सकता है। कई वास्तविक दुनिया डेटाबेस इस समस्या के आसपास काम करते हैं, मास्टर टेबल विदेशी कुंजियों को भौतिक रूप से हटाने के बजाय 'निष्क्रिय' करके, या जटिल अद्यतन कार्यक्रमों द्वारा जो किसी परिवर्तन की आवश्यकता होने पर विदेशी कुंजी के सभी संदर्भों को संशोधित करते हैं।
उदाहरण के लिए, दो तालिकाओं वाले एक डेटाबेस पर विचार करें: एक ग्राहक तालिका जिसमें सभी ग्राहक डेटा और एक ऑर्डर तालिका सम्मिलित होती है जिसमें सभी ग्राहक आदेश सम्मिलित होते हैं। मान लीजिए कि व्यवसाय के लिए आवश्यक है कि प्रत्येक आदेश एक ग्राहक को संदर्भित करे। डेटाबेस में इसे दर्शाने के लिए, ऑर्डर तालिका (जैसे, ग्राहक आईडी) में एक बाह्‌य कुंजी कॉलम जोड़ा जाता है, जो ग्राहक (जैसे ID) की प्राथमिक कुंजी को संदर्भित करता है। क्योंकि किसी तालिका की प्राथमिक कुंजी अद्वितीय होनी चाहिए, और क्योंकि ग्राहक आईडी में केवल उस प्राथमिक कुंजी फ़ील्ड के मान होते हैं, हम मान सकते हैं कि, जब इसका कोई मान होगा, तो ग्राहक आईडी उस विशेष ग्राहक की पहचान करेगा जिसने आदेश दिया था। हालाँकि, यह अब नहीं माना जा सकता है यदि ग्राहक तालिका की पंक्तियों को हटा दिए जाने या आईडी कॉलम को बदल दिए जाने पर ऑर्डर तालिका को अद्यतित नहीं रखा जाता है, और इन तालिकाओं के साथ काम करना अधिक कठिन हो सकता है। कई वास्तविक दुनिया डेटाबेस इस समस्या के आसपास काम करते हैं, मास्टर तालिका बाह्‌य कुंजियों को भौतिक रूप से हटाने के बजाय 'निष्क्रिय' करके, या जटिल अद्यतन कार्यक्रमों द्वारा जो किसी परिवर्तन की आवश्यकता होने पर बाह्‌य कुंजी के सभी संदर्भों को संशोधित करते हैं।
 
[[डेटाबेस डिजाइन]] में बाह्‌य कुंजी एक आवश्यक भूमिका निभाती है। डेटाबेस डिज़ाइन का एक महत्वपूर्ण हिस्सा यह सुनिश्चित कर रहा है कि वास्तविक दुनिया की संस्थाओं के बीच संबंध डेटाबेस में एक तालिका से दूसरी तालिका को संदर्भित करने के लिए बाह्‌य कुंजियों का उपयोग करते हुए संदर्भों में परिलक्षित होते हैं।<ref>{{cite book|last=Sheldon|first=Robert|title=Beginning MySQL|year=2005|publisher=John Wiley & Sons|isbn=0-7645-7950-9|page=156}}</ref>


[[डेटाबेस डिजाइन]] में विदेशी कुंजी एक आवश्यक भूमिका निभाती है। डेटाबेस डिज़ाइन का एक महत्वपूर्ण हिस्सा यह सुनिश्चित कर रहा है कि वास्तविक दुनिया की संस्थाओं के बीच संबंध डेटाबेस में एक तालिका से दूसरी तालिका को संदर्भित करने के लिए विदेशी कुंजियों का उपयोग करते हुए संदर्भों में परिलक्षित होते हैं।<ref>{{cite book|last=Sheldon|first=Robert|title=Beginning MySQL|year=2005|publisher=John Wiley & Sons|isbn=0-7645-7950-9|page=156}}</ref>
डेटाबेस डिज़ाइन का एक अन्य महत्वपूर्ण हिस्सा [[डेटाबेस सामान्यीकरण]] है, जिसमें तालिकाओं को अलग कर दिया जाता है और विदेशी कुंजियाँ उनके लिए पुनर्निर्माण करना संभव बनाती हैं।<ref>{{cite book|last=Garcia-Molina|first=Hector|title=Database Systems: The Complete Book|url=https://archive.org/details/databasesystemsc0000_2ndedgarc|url-access=registration|year=2009|publisher=Prentice Hall|isbn=978-0-13-187325-4|pages=[https://archive.org/details/databasesystemsc0000_2ndedgarc/page/93 93]–95}}</ref>
डेटाबेस डिज़ाइन का एक अन्य महत्वपूर्ण हिस्सा [[डेटाबेस सामान्यीकरण]] है, जिसमें तालिकाओं को अलग कर दिया जाता है और विदेशी कुंजियाँ उनके लिए पुनर्निर्माण करना संभव बनाती हैं।<ref>{{cite book|last=Garcia-Molina|first=Hector|title=Database Systems: The Complete Book|url=https://archive.org/details/databasesystemsc0000_2ndedgarc|url-access=registration|year=2009|publisher=Prentice Hall|isbn=978-0-13-187325-4|pages=[https://archive.org/details/databasesystemsc0000_2ndedgarc/page/93 93]–95}}</ref>
रेफ़रेंसिंग (या चाइल्ड) तालिका में एकाधिक पंक्तियाँ संदर्भित (या पैरेंट) तालिका में समान पंक्ति को संदर्भित कर सकती हैं। इस मामले में, दो तालिकाओं के बीच संबंध को संदर्भित तालिका और संदर्भित तालिका के बीच एक [[कार्डिनैलिटी (डेटा मॉडलिंग)]] कहा जाता है।
रेफ़रेंसिंग (या चाइल्ड) तालिका में एकाधिक पंक्तियाँ संदर्भित (या पैरेंट) तालिका में समान पंक्ति को संदर्भित कर सकती हैं। इस मामले में, दो तालिकाओं के बीच संबंध को संदर्भित तालिका और संदर्भित तालिका के बीच एक [[कार्डिनैलिटी (डेटा मॉडलिंग)]] कहा जाता है।


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


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


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


<वाक्यविन्यास लैंग = एसक्यूएल>
<syntaxhighlight lang="sql">
टेबल बनाएं चाइल्ड_टेबल (
CREATE TABLE child_table (
   col1 पूर्णांक प्राथमिक कुंजी,
   col1 INTEGER PRIMARY KEY,
   col2 वर्ण भिन्न (20),
   col2 CHARACTER VARYING(20),
   col3 पूर्णांक,
   col3 INTEGER,
   col4 पूर्णांक,
   col4 INTEGER,
   विदेशी कुंजी (col3, col4) DELETE CASCADE पर संदर्भ parent_table (col1, col2)
   FOREIGN KEY(col3, col4) REFERENCES parent_table(col1, col2) ON DELETE CASCADE
)
)
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>
 


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


<वाक्यविन्यास लैंग = एसक्यूएल>
यदि बाह्‌य कुंजी केवल एक स्तंभ है, तो निम्न सिंटैक्स का उपयोग करके स्तंभ को इस तरह चिह्नित किया जा सकता है:
टेबल बनाएं चाइल्ड_टेबल (
 
   col1 पूर्णांक प्राथमिक कुंजी,
<syntaxhighlight lang="sql">
   col2 वर्ण भिन्न (20),
CREATE TABLE child_table (
   col3 पूर्णांक,
   col1 INTEGER PRIMARY KEY,
   col4 इंटेगर DELETE CASCADE पर parent_table(col1) का संदर्भ देता है
   col2 CHARACTER VARYING(20),
   col3 INTEGER,
   col4 INTEGER REFERENCES parent_table(col1) ON DELETE CASCADE
)
)
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>
 
बाह्‌य कुंजियों को एक संग्रहीत कार्यविधि विवरण के साथ परिभाषित किया जा सकता है।
 
<syntaxhighlight lang="sql">
sp_foreignkey child_table, parent_table, col3, col4
</syntaxhighlight>
 
 
* चाइल्ड_तालिका: तालिका या दृश्य का नाम जिसमें परिभाषित की जाने वाली बाह्‌य कुंजी है।
* पेरेंट_तालिका: तालिका या दृश्य का नाम जिसमें प्राथमिक कुंजी होती है, जिस पर बाह्‌य कुंजी लागू होती है। प्राथमिक कुंजी पहले से ही परिभाषित होनी चाहिए।
* col3 और col4: बाह्‌य कुंजी बनाने वाले स्तंभों का नाम है। बाह्‌य कुंजी में कम से कम एक कॉलम और अधिकतम आठ कॉलम होने चाहिए।
 
 
 
 
 
 
 
 


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


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


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


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


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


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


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


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


RESTRICT Microsoft SQL 2012 और पहले के द्वारा समर्थित नहीं है।
रेस्ट्रिक्ट माइक्रोसॉफ्ट एसक्यूएल 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 के लिए निर्दिष्ट डिफ़ॉल्ट मान में बदल जाता है। .
सामान्य तौर पर, सेट नल या सेट डिफ़ॉल्ट के लिए डीबीएमएस द्वारा की गई कार्रवाई डिलीट या ON अपडेट दोनों के लिए समान होती है: प्रभावित संदर्भ विशेषताओं का मान सेट नल के लिए नल और सेट डिफ़ॉल्ट के लिए निर्दिष्ट डिफ़ॉल्ट मान में बदल जाता है। .


=== ट्रिगर ===
=== ट्रिगर ===
रेफ़रेंशियल कार्रवाइयाँ आम तौर पर निहित डेटाबेस ट्रिगर के रूप में लागू की जाती हैं (अर्थात सिस्टम-जनित नामों के साथ ट्रिगर, अक्सर छिपे हुए।) इस प्रकार, वे उपयोगकर्ता-परिभाषित ट्रिगर्स के समान सीमाओं के अधीन होते हैं, और अन्य ट्रिगर्स के सापेक्ष उनके निष्पादन के क्रम की आवश्यकता हो सकती है। माना जा रहा है; कुछ मामलों में उचित निष्पादन आदेश सुनिश्चित करने के लिए, या म्यूटिंग-टेबल सीमाओं के आसपास काम करने के लिए रेफ़रेंशियल एक्शन को उसके समकक्ष उपयोगकर्ता-परिभाषित ट्रिगर के साथ बदलना आवश्यक हो सकता है।
रेफ़रेंशियल कार्रवाइयाँ सामान्य रूप में निहित डेटाबेस ट्रिगर के रूप में लागू की जाती हैं (अर्थात प्रणाली-जनित नामों के साथ ट्रिगर, प्रायः छिपे हुए।) इस प्रकार, वे उपयोगकर्ता-परिभाषित ट्रिगर्स के समान सीमाओं के अधीन होते हैं, और अन्य ट्रिगर्स के सापेक्ष उनके निष्पादन के क्रम की आवश्यकता हो सकती है। माना जा रहा है; कुछ मामलों में उचित निष्पादन आदेश सुनिश्चित करने के लिए, या म्यूटिंग-तालिका सीमाओं के आसपास काम करने के लिए रेफ़रेंशियल एक्शन को उसके समकक्ष उपयोगकर्ता-परिभाषित ट्रिगर के साथ बदलना आवश्यक हो सकता है।
 
[[अलगाव (डेटाबेस सिस्टम)|अलगाव (डेटाबेस प्रणाली)]] के साथ एक और महत्वपूर्ण सीमा दिखाई देती है: पंक्ति में आपके परिवर्तन पूरी तरह से कैस्केड करने में सक्षम नहीं हो सकते हैं क्योंकि पंक्ति को डेटा द्वारा संदर्भित किया जाता है जिसे आपका लेनदेन नहीं देख सकता है, और इसलिए कैस्केड नहीं कर सकता। एक उदाहरण: जब आपका लेन-देन किसी ग्राहक खाते को फिर से क्रमांकित करने का प्रयास कर रहा है, तो एक साथ किया गया लेन-देन उसी ग्राहक के लिए एक नया चालान बनाने का प्रयास कर रहा है; जबकि एक कैस्केड नियम उन सभी चालान पंक्तियों को ठीक कर सकता है जिन्हें आपका लेन-देन देख सकता है ताकि उन्हें फिर से क्रमांकित ग्राहक पंक्ति के अनुरूप रखा जा सके, यह डेटा को ठीक करने के लिए किसी अन्य लेनदेन में नहीं पहुंचेगा; क्योंकि जब दो लेन-देन प्रतिबद्ध होते हैं तो डेटाबेस लगातार डेटा की गारंटी नहीं दे सकता है, उनमें से एक को वापस रोल करने के लिए विवश किया जाएगा।
 
<syntaxhighlight lang="sql">
CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
 
CREATE TRIGGER ins_sum BEFORE INSERT ON account
    FOR EACH ROW SET @sum = @sum + NEW.amount;
</syntaxhighlight>
 
 
 
 
 
 
 
 


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


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


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


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


   आपूर्तिकर्ता (आपूर्तिकर्ता संख्या, नाम, पता)
   Supplier ('''SupplierNumber''', Name, Address)
   चालान (चालान संख्या, पाठ, ''आपूर्तिकर्ता संख्या'')
   Invoice ('''InvoiceNumber''', Text, ''SupplierNumber'')


संबंधित [[डेटा परिभाषा भाषा]] स्टेटमेंट इस प्रकार है।
संबंधित [[डेटा परिभाषा भाषा]] स्टेटमेंट इस प्रकार है।
<वाक्यविन्यास लैंग = एसक्यूएल>
<syntaxhighlight lang="sql">
तालिका प्रदायक बनाएं (
CREATE TABLE Supplier (
   प्रदायक संख्या पूर्णांक शून्य नहीं है,
   SupplierNumber INTEGER NOT NULL,
   नाम VARCHAR(20) NULL नहीं,
   Name          VARCHAR(20) NOT NULL,
   पता VARCHAR(50) NULL नहीं,
   Address        VARCHAR(50) NOT NULL,
   बाधा आपूर्तिकर्ता_पीके प्राथमिक कुंजी (आपूर्तिकर्ता संख्या),
   CONSTRAINT supplier_pk PRIMARY KEY(SupplierNumber),
   बाधा संख्या_मूल्य जांच (आपूर्तिकर्ता संख्या> 0)
   CONSTRAINT number_value CHECK(SupplierNumber > 0)
)
)


तालिका चालान बनाएँ (
CREATE TABLE Invoice (
   चालान संख्या पूर्णांक नहीं है,
   InvoiceNumber  INTEGER NOT NULL,
   टेक्स्ट वर्चर (4096),
   Text          VARCHAR(4096),
   प्रदायक संख्या पूर्णांक शून्य नहीं है,
   SupplierNumber INTEGER NOT NULL,
   बाधा चालान_pk प्राथमिक कुंजी (चालान संख्या),
   CONSTRAINT invoice_pk PRIMARY KEY(InvoiceNumber),
   CONSTRAINT inumber_value चेक (इनवॉइसनंबर > 0),
   CONSTRAINT inumber_value CHECK (InvoiceNumber > 0),
   बाधा आपूर्तिकर्ता_fk
   CONSTRAINT supplier_fk
     विदेशी कुंजी (आपूर्तिकर्ता संख्या) संदर्भ आपूर्तिकर्ता (आपूर्तिकर्ता संख्या)
     FOREIGN KEY(SupplierNumber) REFERENCES Supplier(SupplierNumber)
     डिलीट रेस्ट्रिक्ट पर अपडेट कैस्केड पर
     ON UPDATE CASCADE ON DELETE RESTRICT
)
)
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>
 
 
 
 
 
 
 
 
 
 
 


== यह भी देखें ==
== यह भी देखें ==
* उम्मीदवार कुंजी
* कैंडिडेट कुंजी
* [[यौगिक कुंजी]]
* [[यौगिक कुंजी]]
* [[सुपरकी]]
* [[सुपरकी]]
* [[जंक्शन टेबल]]
* [[जंक्शन टेबल|जंक्शन तालिका]]


== संदर्भ ==
== संदर्भ ==
{{Reflist}}
{{Reflist}}
== बाहरी संबंध ==
== बाहरी संबंध ==
*[https://mariadb.com/kb/en/library/foreign-keys/ SQL-99 Foreign Keys]
*[https://mariadb.com/kb/en/library/foreign-keys/ एसक्यूएल-99 Foreign Keys]
*[http://www.postgresql.org/docs/current/static/tutorial-fk.html PostgreSQL Foreign Keys]
*[http://www.postgresql.org/docs/current/static/tutorial-fk.html Postgreएसक्यूएल Foreign Keys]
*[http://dev.mysql.com/doc/refman/5.1/en/create-table-foreign-keys.html MySQL Foreign Keys]
*[http://dev.mysql.com/doc/refman/5.1/en/create-table-foreign-keys.html Myएसक्यूएल Foreign Keys]
*[http://www.firebirdsql.org/manual/nullguide-keys.html#nullguide-keys-fk FirebirdSQL primary Keys]
*[http://www.firebirdsql.org/manual/nullguide-keys.html#nullguide-keys-fk Firebirdएसक्यूएल primary Keys]
*[https://web.archive.org/web/20110629025953/http://www.sqlite.org/foreignkeys.html SQLite support for Foreign Keys]
*[https://web.archive.org/web/20110629025953/http://www.sqlite.org/foreignkeys.html एसक्यूएलite support for Foreign Keys]
*[https://technet.microsoft.com/en-us/library/ms188066.aspx Microsoft SQL 2012 table_constraint (Transact-SQL)]
*[https://technet.microsoft.com/en-us/library/ms188066.aspx माइक्रोसॉफ्ट एसक्यूएल 2012 table_constraint (Transact-एसक्यूएल)]
{{Databases}}
{{DEFAULTSORT:Foreign Key}}  
 
{{DEFAULTSORT:Foreign Key}}[[Category: मॉडलिंग की दिनांक]] [[Category: डेटाबेस]] [[Category: एसक्यूएल]] [[Category: SQL कोड उदाहरण के साथ लेख]]


[[de:Schlüssel (Datenbank)#Fremdschlüssel]]
[[de:Schlüssel (Datenbank)#Fremdschlüssel]]
[[no:Nøkkel (database)#Fremmednøkkel]]
[[no:Nøkkel (database)#Fremmednøkkel]]


 
[[Category:Articles with hatnote templates targeting a nonexistent page|Foreign Key]]
 
[[Category:Collapse templates|Foreign Key]]
[[Category: Machine Translated Page]]
[[Category:Created On 16/02/2023|Foreign Key]]
[[Category:Created On 16/02/2023]]
[[Category:Database management systems|Foreign Key]]
[[Category:Machine Translated Page|Foreign Key]]
[[Category:Navigational boxes| ]]
[[Category:Navigational boxes without horizontal lists|Foreign Key]]
[[Category:Pages with script errors|Foreign Key]]
[[Category:SQL कोड उदाहरण के साथ लेख|Foreign Key]]
[[Category:Sidebars with styles needing conversion|Foreign Key]]
[[Category:Templates Vigyan Ready]]
[[Category:एसक्यूएल|Foreign Key]]
[[Category:डेटाबेस|Foreign Key]]
[[Category:मॉडलिंग की दिनांक|Foreign Key]]

Latest revision as of 10:37, 23 February 2023

बाह्‌य कुंजी (फॉरेन की) तालिका में विशेषताओं का एक समुच्चय है जो किसी अन्य तालिका की प्राथमिक कुंजी को संदर्भित करती है। बाह्‌य कुंजी इन दो तालिकाओं को जोड़ने का काम करती है। इसे रखने का दूसरा तरीका: संबंधपरक डेटाबेस के संदर्भ में, एक विदेशी कुंजी एक निश्चित प्रकार की समावेशन निर्भरता बाधा के अधीन विशेषताओं का एक सेट है, विशेष रूप से एक बाधा जो किसी संबंध में विदेशी कुंजी विशेषता (कंप्यूटिंग) वाले टपल, आर में कुछ अन्य संबंध होने चाहिए एस में भी उपस्थित होना चाहिए, और इसके अलावा उन सुविधाओं को भी एस में कैंडिडेट कुंजी होना चाहिए।[1][2][3] सरल शब्दों में, बाह्‌य कुंजी उन विशेषताओं का एक समूह है जो कैंडिडेट कुंजी को संदर्भ देती है। उदाहरण के लिए, टीम नामक तालिका में एक विशेषता मेंबर_नेम हो सकती है, जो कि पर्सन तालिका में कैंडिडेट कुंजी, पर्सन_नेम को संदर्भित करने वाली एक बाह्‌य कुंजी है। चूंकि मेंबर_नेम एक बाह्‌य कुंजी है, टीम में किसी सदस्य के नाम के रूप में उपस्थितकोई भी मान पर्सन तालिका में किसी व्यक्ति के नाम के रूप में भी उपस्थितहोना चाहिए; दूसरे शब्दों में, टीम का प्रत्येक सदस्य भी एक व्यक्ति होता है।

सारांश

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

चूंकि बाह्‌य कुंजी का उद्देश्य संदर्भित तालिका की एक विशेष पंक्ति की पहचान करना है, सामान्य रूप में यह आवश्यक है कि बाह्‌य कुंजी प्राथमिक तालिका की कुछ पंक्ति में कैंडिडेट कुंजी के बराबर हो, अन्यथा इसका कोई मूल्य शून्य है।[2]). इस नियम को दो तालिकाओं के बीच संदर्भित अखंडता कहा जाता है।[5]क्योंकि इन बाधाओं का उल्लंघन कई डेटाबेस समस्याओं का स्रोत हो सकता है, अधिकांश डेटाबेस प्रबंधन प्रणालियां यह सुनिश्चित करने के लिए तंत्र प्रदान करती हैं कि प्रत्येक गैर-शून्य बाह्‌य कुंजी संदर्भित तालिका की एक पंक्ति से मेल खाती है।[6][7][8]

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

डेटाबेस डिजाइन में बाह्‌य कुंजी एक आवश्यक भूमिका निभाती है। डेटाबेस डिज़ाइन का एक महत्वपूर्ण हिस्सा यह सुनिश्चित कर रहा है कि वास्तविक दुनिया की संस्थाओं के बीच संबंध डेटाबेस में एक तालिका से दूसरी तालिका को संदर्भित करने के लिए बाह्‌य कुंजियों का उपयोग करते हुए संदर्भों में परिलक्षित होते हैं।[9]

डेटाबेस डिज़ाइन का एक अन्य महत्वपूर्ण हिस्सा डेटाबेस सामान्यीकरण है, जिसमें तालिकाओं को अलग कर दिया जाता है और विदेशी कुंजियाँ उनके लिए पुनर्निर्माण करना संभव बनाती हैं।[10]

रेफ़रेंसिंग (या चाइल्ड) तालिका में एकाधिक पंक्तियाँ संदर्भित (या पैरेंट) तालिका में समान पंक्ति को संदर्भित कर सकती हैं। इस मामले में, दो तालिकाओं के बीच संबंध को संदर्भित तालिका और संदर्भित तालिका के बीच एक कार्डिनैलिटी (डेटा मॉडलिंग) कहा जाता है।

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

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

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

CREATE TABLE child_table (
  col1 INTEGER PRIMARY KEY,
  col2 CHARACTER VARYING(20),
  col3 INTEGER,
  col4 INTEGER,
  FOREIGN KEY(col3, col4) REFERENCES parent_table(col1, col2) ON DELETE CASCADE
)


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

CREATE TABLE child_table (
  col1 INTEGER PRIMARY KEY,
  col2 CHARACTER VARYING(20),
  col3 INTEGER,
  col4 INTEGER REFERENCES parent_table(col1) ON DELETE CASCADE
)

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

sp_foreignkey child_table, parent_table, col3, col4


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







संदर्भित क्रियाएं

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

  • कैस्केड
  • प्रतिबंध लगाना
  • कोई कार्रवाई नहीं
  • समुच्चय न्यूल
  • समुच्चय नल, समुच्चय डिफॉल्ट

कैस्केड

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

प्रतिबंधित करें

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

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

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

रेस्ट्रिक्ट माइक्रोसॉफ्ट एसक्यूएल 2012 और पहले के द्वारा समर्थित नहीं है।

कोई कार्रवाई नहीं

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

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

समुच्चय नल, समुच्चय डिफ़ॉल्ट

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

ट्रिगर

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

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

CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));

CREATE TRIGGER ins_sum BEFORE INSERT ON account
     FOR EACH ROW SET @sum = @sum + NEW.amount;







उदाहरण

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

 Supplier (SupplierNumber, Name, Address)
 Invoice (InvoiceNumber, Text, SupplierNumber)

संबंधित डेटा परिभाषा भाषा स्टेटमेंट इस प्रकार है।

CREATE TABLE Supplier (
  SupplierNumber INTEGER NOT NULL,
  Name           VARCHAR(20) NOT NULL,
  Address        VARCHAR(50) NOT NULL,
  CONSTRAINT supplier_pk PRIMARY KEY(SupplierNumber),
  CONSTRAINT number_value CHECK(SupplierNumber > 0)
)

CREATE TABLE Invoice (
  InvoiceNumber  INTEGER NOT NULL,
  Text           VARCHAR(4096),
  SupplierNumber INTEGER NOT NULL,
  CONSTRAINT invoice_pk PRIMARY KEY(InvoiceNumber),
  CONSTRAINT inumber_value CHECK (InvoiceNumber > 0),
  CONSTRAINT supplier_fk
    FOREIGN KEY(SupplierNumber) REFERENCES Supplier(SupplierNumber)
    ON UPDATE CASCADE ON DELETE RESTRICT
)







यह भी देखें

संदर्भ

  1. Coronel, Carlos (2010). Database Systems: Design, Implementation, and Management. Independence KY: South-Western/Cengage Learning. p. 65. ISBN 978-0-538-74884-1.
  2. 2.0 2.1 Elmasri, Ramez (2011). Fundamentals of Database Systems. Addison-Wesley. pp. 73–74. ISBN 978-0-13-608620-8.
  3. Date, C. J. (1996). A guide to the SQL standard. Addison-Wesley. p. 206. ISBN 978-0201964264.
  4. Sheldon, Robert (2005). Beginning MySQL. John Wiley & Sons. pp. 119–122. ISBN 0-7645-7950-9.
  5. "Database Basics — Foreign Keys". Retrieved 2010-03-13.
  6. MySQL AB (2006). MySQL Administrator's Guide and Language Reference. Sams Publishing. p. 40. ISBN 0-672-32870-4.
  7. Powell, Gavin (2004). Oracle SQL: Jumpstart with Examples. Elsevier. p. 11. ASIN B008IU3AHY.
  8. Mullins, Craig (2012). DB2 developer's guide. IBM Press. ASIN B007Y6K9TK.
  9. Sheldon, Robert (2005). Beginning MySQL. John Wiley & Sons. p. 156. ISBN 0-7645-7950-9.
  10. Garcia-Molina, Hector (2009). Database Systems: The Complete Book. Prentice Hall. pp. 93–95. ISBN 978-0-13-187325-4.

बाहरी संबंध