SQL में, आप एक विदेशी कुंजी बाधा बनाकर संबंध बनाते हैं।
अधिक विशेष रूप से, आपके पास पैरेंट टेबल और चाइल्ड टेबल है। पैरेंट में प्राथमिक कुंजी होती है, और चाइल्ड टेबल में एक विदेशी कुंजी होती है जो पैरेंट टेबल की प्राथमिक कुंजी को संदर्भित करती है।
जब आप संबंध बनाने के लिए SQL का उपयोग करते हैं, तो आप तालिका बनाते समय संबंध बना सकते हैं, या आप इसे बाद में (तालिका में परिवर्तन करके) बना सकते हैं। इस लेख में दोनों परिदृश्य शामिल हैं।
तालिका बनाते समय संबंध बनाएं
यहां आपके CREATE TABLE
में संबंध बनाने का एक उदाहरण दिया गया है तालिका बनाते समय कथन।
CREATE TABLE Parent (
ParentId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ParentName nvarchar(255) NOT NULL
)
CREATE TABLE Child (
ChildId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ChildName nvarchar(255) NOT NULL,
ParentId int NOT NULL
CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)
REFERENCES Parent (ParentId)
);
यहां मैंने दो टेबल बनाए; एक जिसे Parent
. कहा जाता है और दूसरे को Child
. कहा जाता है .
मैंने बच्चे के लिए तालिका परिभाषा के भीतर संबंध बनाया है। संबंध CONSTRAINT
. के साथ बनाया गया है बहस। ध्यान दें कि यह अभी भी CREATE TABLE
के अंदर है बयान।
रिश्ते को एक नाम चाहिए। इस मामले में मैंने इसे FK_Child_Parent
. कहा है . FOREIGN KEY
भाग के बाद कॉलम का नाम आता है (चाइल्ड टेबल में) जो कि विदेशी कुंजी होगी।
REFERENCES
भाग उस कॉलम को निर्दिष्ट करता है जिसे विदेशी कुंजी संदर्भित करेगी। इस मामले में यह ParentId
. का संदर्भ देता है Parent
. का स्तंभ टेबल। यह REFERENCES Parent (ParentId)
. का उपयोग करके किया जाता है ।
संबंध बनाने के लिए बस इतना ही आवश्यक है।
ध्यान दें कि इस पृष्ठ पर उदाहरण SQL सर्वर का उपयोग करके किए गए थे। आपके डीबीएमएस के आधार पर, आपको कॉलम परिभाषाओं के कुछ विवरण बदलने की आवश्यकता हो सकती है।
उदाहरण के लिए IDENTITY
SQL सर्वर का संस्करण है जिसे कभी-कभी AUTO_INCREMENT
. कहा जाता है अन्य DBMS (जैसे MySQL) में। यदि आप SQLite का उपयोग करते हैं, तो यहां SQLite में एक ऑटो-इन्क्रीमेंटिंग कॉलम बनाने का तरीका बताया गया है।
मौजूदा तालिका में संबंध जोड़ें
आप केवल ALTER TABLE
. का उपयोग करके किसी मौजूदा तालिका में संबंध भी जोड़ सकते हैं बयान।
आइए दिखाते हैं कि पिछले उदाहरण से दो टेबल बनाते समय हमने संबंध नहीं बनाया था। तो चलिए दिखाते हैं कि हमने इसके बजाय ऐसा किया है:
CREATE TABLE Parent (
ParentId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ParentName nvarchar(255) NOT NULL
)
CREATE TABLE Child (
ChildId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ChildName nvarchar(255) NOT NULL,
ParentId int NOT NULL
);
तो इस परिदृश्य में, हमने केवल दो टेबल बनाए। उनके बीच कोई संबंध नहीं बना।
अब, टेबल बनाने के बाद, हमें अचानक याद आता है "ओह डांग, मैं एक रिश्ता बनाना भूल गया!"।
कोई बात नहीं, अब हम यह कर सकते हैं:
ALTER TABLE Child
ADD CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)
REFERENCES Parent (ParentId);
पूर्ण। हमने पिछले उदाहरण के अनुसार समान विवरण का उपयोग करके अभी-अभी संबंध जोड़ा है।
ध्यान दें कि SQLite ALTER TABLE
. के साथ विदेशी कुंजियों को जोड़ने का समर्थन नहीं करता है बयान। इसके बारे में अधिक जानने के लिए देखें कि SQLite में किसी मौजूदा तालिका में विदेशी कुंजी कैसे जोड़ें।
अपडेट पर/हटाएं
डिफ़ॉल्ट रूप से, SQL सर्वर संबंध ON DELETE NO ACTION
. का उपयोग करके बनाए जाते हैं और ON UPDATE NO ACTION
. इसलिए, पिछले उदाहरण इस सेटिंग का उपयोग करके बनाए गए थे।
हालाँकि, विभिन्न DBMS अन्य डिफ़ॉल्ट सेटिंग्स का उपयोग कर सकते हैं।
किसी भी तरह से, आप इसे अपने कोड में स्पष्ट रूप से निर्दिष्ट कर सकते हैं। तो हम इस तरह दिखने के लिए पिछले उदाहरण को संशोधित कर सकते हैं:
ALTER TABLE Child
ADD CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)
REFERENCES Parent (ParentId)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
इसका वास्तव में मतलब यह है कि, अगर कोई प्राथमिक कुंजी में रिकॉर्ड को हटाने या अपडेट करने का प्रयास करता है, तो एक त्रुटि होगी और परिवर्तन वापस ले लिया जाएगा। यह किसी भी परिवर्तन को रोकने का SQL सर्वर का तरीका है जो आपके सिस्टम की संदर्भात्मक अखंडता को भंग कर सकता है।
मूल रूप से, आपके द्वारा पहली बार में संबंध बनाने का कारण संदर्भात्मक अखंडता को लागू करना है।
हालाँकि, आपके पास कुछ विकल्प हैं कि आप SQL सर्वर को इन स्थितियों से कैसे निपटना चाहते हैं।
विशेष रूप से, आप निम्न में से किसी भी मान का उपयोग कर सकते हैं:
NO ACTION
:एक त्रुटि उत्पन्न होती है और पैरेंट तालिका में पंक्ति पर हटाने/अपडेट करने की क्रिया को वापस ले लिया जाता है।CASCADE
:यदि उस पंक्ति को मूल तालिका से हटा दिया जाता है/अपडेट किया जाता है तो संबंधित पंक्तियों को संदर्भ तालिका से हटा दिया जाता है/अपडेट किया जाता है।SET NULL
:विदेशी कुंजी बनाने वाले सभी मानNULL
. पर सेट हैं यदि मूल तालिका में संबंधित पंक्ति हटा दी जाती है या अद्यतन की जाती है। इसके लिए आवश्यक है कि विदेशी कुंजी कॉलम अशक्त हों।SET DEFAULT
:विदेशी कुंजी बनाने वाले सभी मान अपने डिफ़ॉल्ट मानों पर सेट हो जाते हैं यदि मूल तालिका में संबंधित पंक्ति हटा दी जाती है या अपडेट की जाती है। इस बाधा को निष्पादित करने के लिए, सभी विदेशी कुंजी स्तंभों में डिफ़ॉल्ट परिभाषाएँ होनी चाहिए। यदि कोई कॉलम अशक्त है, और कोई स्पष्ट डिफ़ॉल्ट मान सेट नहीं है,NULL
स्तंभ का अंतर्निहित डिफ़ॉल्ट मान बन जाता है।