बाह्य कुंजी (फॉरेन की): Difference between revisions
(→ट्रिगर) |
|||
Line 101: | Line 101: | ||
[[अलगाव (डेटाबेस सिस्टम)|अलगाव (डेटाबेस प्रणाली)]] के साथ एक और महत्वपूर्ण सीमा दिखाई देती है: पंक्ति में आपके परिवर्तन पूरी तरह से कैस्केड करने में सक्षम नहीं हो सकते हैं क्योंकि पंक्ति को डेटा द्वारा संदर्भित किया जाता है जिसे आपका लेनदेन नहीं देख सकता है, और इसलिए कैस्केड नहीं कर सकता। एक उदाहरण: जब आपका लेन-देन किसी ग्राहक खाते को फिर से क्रमांकित करने का प्रयास कर रहा है, तो एक साथ किया गया लेन-देन उसी ग्राहक के लिए एक नया चालान बनाने का प्रयास कर रहा है; जबकि एक कैस्केड नियम उन सभी चालान पंक्तियों को ठीक कर सकता है जिन्हें आपका लेन-देन देख सकता है ताकि उन्हें फिर से क्रमांकित ग्राहक पंक्ति के अनुरूप रखा जा सके, यह डेटा को ठीक करने के लिए किसी अन्य लेनदेन में नहीं पहुंचेगा; क्योंकि जब दो लेन-देन प्रतिबद्ध होते हैं तो डेटाबेस लगातार डेटा की गारंटी नहीं दे सकता है, उनमें से एक को वापस रोल करने के लिए मजबूर किया जाएगा (प्रायः पहले आओ-पहले पाओ के आधार पर।) | [[अलगाव (डेटाबेस सिस्टम)|अलगाव (डेटाबेस प्रणाली)]] के साथ एक और महत्वपूर्ण सीमा दिखाई देती है: पंक्ति में आपके परिवर्तन पूरी तरह से कैस्केड करने में सक्षम नहीं हो सकते हैं क्योंकि पंक्ति को डेटा द्वारा संदर्भित किया जाता है जिसे आपका लेनदेन नहीं देख सकता है, और इसलिए कैस्केड नहीं कर सकता। एक उदाहरण: जब आपका लेन-देन किसी ग्राहक खाते को फिर से क्रमांकित करने का प्रयास कर रहा है, तो एक साथ किया गया लेन-देन उसी ग्राहक के लिए एक नया चालान बनाने का प्रयास कर रहा है; जबकि एक कैस्केड नियम उन सभी चालान पंक्तियों को ठीक कर सकता है जिन्हें आपका लेन-देन देख सकता है ताकि उन्हें फिर से क्रमांकित ग्राहक पंक्ति के अनुरूप रखा जा सके, यह डेटा को ठीक करने के लिए किसी अन्य लेनदेन में नहीं पहुंचेगा; क्योंकि जब दो लेन-देन प्रतिबद्ध होते हैं तो डेटाबेस लगातार डेटा की गारंटी नहीं दे सकता है, उनमें से एक को वापस रोल करने के लिए मजबूर किया जाएगा (प्रायः पहले आओ-पहले पाओ के आधार पर।) | ||
< | <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> | ||
[[Category:Articles with hatnote templates targeting a nonexistent page|Foreign Key]] | |||
[[Category:Collapse templates|Foreign Key]] | |||
[[Category:Created On 16/02/2023|Foreign Key]] | |||
[[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]] | |||
== उदाहरण == | == उदाहरण == |
Revision as of 16:25, 19 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;
उदाहरण
बाह्य कुंजियों को दर्शाने के लिए पहले उदाहरण के रूप में, मान लीजिए कि एक खाता डेटाबेस में चालान के साथ एक तालिका है और प्रत्येक चालान एक विशेष आपूर्तिकर्ता से जुड़ा हुआ है। आपूर्तिकर्ता विवरण (जैसे नाम और पता) एक अलग तालिका में रखा जाता है; प्रत्येक आपूर्तिकर्ता को उसकी पहचान करने के लिए एक 'आपूर्तिकर्ता संख्या' दी जाती है। प्रत्येक चालान रिकॉर्ड में उस चालान के लिए आपूर्तिकर्ता संख्या वाली एक विशेषता होती है। फिर, आपूर्तिकर्ता तालिका में 'आपूर्तिकर्ता संख्या' प्राथमिक कुंजी है। चालान तालिका में बाह्य कुंजी उस प्राथमिक कुंजी को इंगित करती है। रिलेशनल स्कीमा निम्नलिखित है। प्राथमिक कुंजियों को बोल्ड में चिह्नित किया गया है, और बाह्य कुंजियों को इटैलिक में चिह्नित किया गया है।
आपूर्तिकर्ता (आपूर्तिकर्ता संख्या, नाम, पता) चालान (चालान संख्या, पाठ, आपूर्तिकर्ता संख्या)
संबंधित डेटा परिभाषा भाषा स्टेटमेंट इस प्रकार है। <वाक्यविन्यास लैंग = एसक्यूएल> तालिका प्रदायक बनाएं (
प्रदायक संख्या पूर्णांक शून्य नहीं है, नाम VARCHAR(20) नल नहीं, पता VARCHAR(50) नल नहीं, बाधा आपूर्तिकर्ता_पीके प्राथमिक कुंजी (आपूर्तिकर्ता संख्या), बाधा संख्या_मूल्य जांच (आपूर्तिकर्ता संख्या> 0)
)
तालिका चालान बनाएँ (
चालान संख्या पूर्णांक नहीं है, टेक्स्ट वर्चर (4096), प्रदायक संख्या पूर्णांक शून्य नहीं है, बाधा चालान_pk प्राथमिक कुंजी (चालान संख्या), CONSTRAINT inumber_value चेक (इनवॉइसनंबर > 0), बाधा आपूर्तिकर्ता_fk बाह्य कुंजी (आपूर्तिकर्ता संख्या) संदर्भ आपूर्तिकर्ता (आपूर्तिकर्ता संख्या) डिलीट रेस्ट्रिक्ट पर अपडेट कैस्केड पर
) </वाक्यविन्यास हाइलाइट>
यह भी देखें
- कैंडिडेट कुंजी
- यौगिक कुंजी
- सुपरकी
- जंक्शन तालिका
संदर्भ
- ↑ Coronel, Carlos (2010). Database Systems: Design, Implementation, and Management. Independence KY: South-Western/Cengage Learning. p. 65. ISBN 978-0-538-74884-1.
- ↑ 2.0 2.1 Elmasri, Ramez (2011). Fundamentals of Database Systems. Addison-Wesley. pp. 73–74. ISBN 978-0-13-608620-8.
- ↑ Date, C. J. (1996). A guide to the SQL standard. Addison-Wesley. p. 206. ISBN 978-0201964264.
- ↑ Sheldon, Robert (2005). Beginning MySQL. John Wiley & Sons. pp. 119–122. ISBN 0-7645-7950-9.
- ↑ "Database Basics — Foreign Keys". Retrieved 2010-03-13.
- ↑ MySQL AB (2006). MySQL Administrator's Guide and Language Reference. Sams Publishing. p. 40. ISBN 0-672-32870-4.
- ↑ Powell, Gavin (2004). Oracle SQL: Jumpstart with Examples. Elsevier. p. 11. ASIN B008IU3AHY.
- ↑ Mullins, Craig (2012). DB2 developer's guide. IBM Press. ASIN B007Y6K9TK.
- ↑ Sheldon, Robert (2005). Beginning MySQL. John Wiley & Sons. p. 156. ISBN 0-7645-7950-9.
- ↑ Garcia-Molina, Hector (2009). Database Systems: The Complete Book. Prentice Hall. pp. 93–95. ISBN 978-0-13-187325-4.