SQL सर्वर में दो तालिकाओं के बीच संबंध बनाने का तरीका जानें।
रिलेशनल डेटाबेस डिज़ाइन में, एक रिलेशनशिप वह जगह है जहाँ दो या दो से अधिक तालिकाएँ एक साथ जुड़ी होती हैं क्योंकि उनमें संबंधित डेटा होता है। यह उपयोगकर्ताओं को कई तालिकाओं में संबंधित डेटा के लिए क्वेरी चलाने में सक्षम बनाता है।
ट्यूटोरियल का यह हिस्सा बताता है कि निम्नलिखित संबंध कैसे बनाएं:
उस आरेख में दो संबंध हैं। Albums
. के बीच एक संबंध है और Artists
टेबल, और Albums
. के बीच एक और संबंध है और Genres
टेबल.
उस आरेख को देखकर, हम देख सकते हैं कि एक कलाकार के पास कई एल्बम हो सकते हैं। इस मामले में, हमारे पास केवल एक पंक्ति होनी चाहिए जिसमें कलाकार का नाम हो, चाहे उनके पास कितने भी एल्बम हों। ऐसा इसलिए है क्योंकि हम Artists
. में एक रिकॉर्ड बना सकते हैं एक अद्वितीय ArtistId
. के साथ तालिका . उस कलाकार के सभी एल्बम Albums
. में रहेंगे तालिका, और उनमें एक ही कलाकार आईडी अपने ArtistId
. में होगी कॉलम। ऐसा करने से, हम दोनों तालिकाओं में एक क्वेरी चला सकते हैं और कलाकार का नाम, साथ ही उनके द्वारा जारी किए गए सभी एल्बम वापस कर सकते हैं। यही है रिश्तों का फायदा।
पहले हमने उपरोक्त तीन तालिकाओं वाला एक डेटाबेस बनाया था। जब हमने ऐसा किया, तो हमने उपरोक्त आरेख में दर्शाए गए संबंधों में से एक भी बनाया। हमने Albums
. के बीच संबंध बनाया है तालिका और Artists
तालिका (जहां ArtistId
Albums
. का कॉलम तालिका ArtistsId
. का संदर्भ देती है Artists
. का स्तंभ टेबल)।
टेबल बनाने के लिए हमने जो कोड चलाया वह यहां दिया गया है:
हाइलाइट किया गया कोड वह हिस्सा है जो Albums
. के बीच संबंध बनाता है तालिका और Artists
टेबल। यह ArtistId
. सेट करके ऐसा करता है Albums
. का कॉलम ArtistId
. को संदर्भित करने के लिए Artists
. का स्तंभ टेबल।
यह कहने का एक और तकनीकी तरीका यह है कि Albums.ArtistId
Artists.ArtistId
. की विदेशी कुंजी बन जाती है (जो स्वयं उस तालिका की प्राथमिक कुंजी है)। यह एक विदेशी कुंजी बाधा है।
विदेशी कुंजी प्रतिबंध क्या है?
एक विदेशी कुंजी बाधा इस तालिका और दूसरी तालिका के बीच संबंध को परिभाषित करता है। जब आप एक विदेशी कुंजी बाधा बनाते हैं, तो आप इसे बच्चे . में एक विशिष्ट कॉलम के विरुद्ध बनाते हैं तालिका, पैरेंट . में एक विशिष्ट कॉलम को संदर्भित करने के लिए टेबल।
यह चाइल्ड टेबल के उस कॉलम को विदेशी कुंजी . बनाता है . बाधा यह सुनिश्चित करती है कि इस (विदेशी कुंजी) कॉलम में जाने वाला कोई भी मान मूल तालिका के प्राथमिक कुंजी कॉलम के मान से मेल खाता हो। अगर कोई ऐसा मान दर्ज करने का प्रयास करता है जो मूल तालिका के प्राथमिक कुंजी कॉलम में किसी मान से मेल नहीं खाता है, तो SQL सर्वर एक त्रुटि फेंक देगा।
यह संदर्भात्मक अखंडता को लागू करने में मदद करता है। यह हमें अनाथ रिकॉर्ड (बाल रिकॉर्ड जिनमें कोई माता-पिता नहीं है) होने से रोकता है। या हमारे उदाहरण में, ऐसे एल्बम जो किसी कलाकार से संबद्ध नहीं हैं।
यदि आप SSMS या Azure डेटा स्टूडियो जैसे GUI डेटाबेस प्रबंधन टूल का उपयोग करते हैं, तो संबंध Keys
के अंतर्गत दिखाई देगा विदेशी कुंजी के साथ तालिका के लिए नोड:
आइए कोड का पुनर्निर्माण करें:
CONSTRAINT FK_Albums_Artists FOREIGN KEY (ArtistId) REFERENCES dbo.Artists (ArtistId) ON DELETE NO ACTION ON UPDATE NO ACTION
पहली दो पंक्तियाँ संबंध बनाती हैं। वे
Albums.ArtistId
. के बीच एक विदेशी कुंजी बाधा उत्पन्न करते हैं कॉलम और
Artist.ArtistId
कॉलम। इस मामले में हम विदेशी कुंजी बाधा FK_Albums_Artists
. कहते हैं ।
अंतिम दो पंक्तियाँ निर्दिष्ट करती हैं कि SQL सर्वर को क्या करना चाहिए यदि कोई पैरेंट रिकॉर्ड को हटाने या अद्यतन करने का प्रयास करता है जिसे चाइल्ड टेबल में रिकॉर्ड द्वारा संदर्भित किया जा रहा है। इस मामले में, NO ACTION
इसका मतलब है कि डिलीट/अपडेट आगे नहीं बढ़ेगा। उपयोगकर्ता को बस एक त्रुटि मिलेगी।
आप इसे ON DELETE CASCADE
. में बदल सकते हैं यदि आप माता-पिता और बच्चे को एक बार में हटाने में सक्षम होना चाहते हैं (यानी हटाना माता-पिता से बच्चे तक पहुंच जाएगा)। ON UPDATE CASADE
. का उपयोग करके अपडेट पर भी यही तर्क लागू होता है ।
NO ACTION
डिफ़ॉल्ट मान है, इसलिए हम कोड की उन अंतिम दो पंक्तियों के बिना कर सकते थे। हालांकि, मैंने इसे शामिल किया, क्योंकि विदेशी कुंजी बाधाओं को बनाते समय यह सोचना एक महत्वपूर्ण कारक है।
मौजूदा तालिका में संबंध जोड़ें
पिछला उदाहरण उसी समय एक संबंध बनाता है जब तालिकाएँ बनाई जाती हैं। हालाँकि, कई बार ऐसा भी हो सकता है कि आपको किसी मौजूदा तालिका में संबंध जोड़ने की आवश्यकता हो।
आइए Genres
. के बीच एक नया संबंध जोड़ें और Albums
टेबल.
निम्नलिखित कोड चलाएँ:
USE Music; ALTER TABLE Albums ADD CONSTRAINT FK_Albums_Genres FOREIGN KEY (GenreId) REFERENCES dbo.Genres (GenreId) ON DELETE NO ACTION ON UPDATE NO ACTION ;
यह Albums
. पर एक नई विदेशी कुंजी बनाता है टेबल। इसका परिणाम Albums.GenreId
. होता है Genres.GenreId
. का संदर्भ देने वाली विदेशी कुंजी बनना ।
तो उस कथन को चलाने के परिणामस्वरूप कुंजी . के अंतर्गत एक नई विदेशी कुंजी प्रदर्शित की जा रही है नोड:
सिंगल कॉलम फॉरेन कीज
एकल स्तंभ विदेशी कुंजियाँ (जैसे ऊपर दी गई हैं) भी स्तंभ स्तर पर निर्दिष्ट की जा सकती हैं। तो Albums
बनाने का दूसरा तरीका तालिका और उसकी विदेशी कुंजी इस प्रकार है:
CREATE TABLE Albums ( AlbumId int IDENTITY(1,1) NOT NULL PRIMARY KEY, AlbumName nvarchar(255) NOT NULL, ReleaseDate date NOT NULL, ArtistId int NOT NULL REFERENCES Artists(ArtistId), GenreId int NOT NULL );
इस विधि का उपयोग बहु-स्तंभ कुंजी बाधाओं पर नहीं किया जा सकता है, इसलिए उनके लिए, उपरोक्त मूल उदाहरण में सिंटैक्स का उपयोग करें।
बहु-स्तंभ विदेशी कुंजियाँ
एक बहुस्तंभ विदेशी कुंजी वह है जहां विदेशी कुंजी के लिए एक से अधिक कॉलम का उपयोग किया जाता है। यह आमतौर पर तब उपयोग किया जाता है जब मूल तालिका अपनी प्राथमिक कुंजी के लिए एकाधिक कॉलम का उपयोग करती है। यह मामला हो सकता है यदि मूल तालिका एक अद्वितीय मान बनाने के लिए दो स्तंभों के मानों को जोड़ती है।
उपरोक्त मूल उदाहरण में वाक्य रचना का उपयोग करके बहु-स्तंभ विदेशी कुंजियाँ बनाई जा सकती हैं। बस प्रत्येक स्तंभ नाम को अल्पविराम से अलग करके जोड़ें।
तो अगर हम कल्पना करें कि Albums
तालिका में एक ArtistName
भी है कॉलम (और वह Artists
तालिका ArtistId
. का उपयोग करती है और ArtistName
इसकी प्राथमिक कुंजी के रूप में), एक बहु-स्तंभ विदेशी कुंजी इस तरह दिखाई देगी:
CONSTRAINT FK_Albums_Artists FOREIGN KEY (ArtistId, ArtistName) REFERENCES dbo.Artists (ArtistId, ArtistName)