SQL सर्वर में बाधाएं पूर्वनिर्धारित नियम हैं जिन्हें आप एकल या एकाधिक स्तंभों पर लागू कर सकते हैं। ये बाधाएं इन स्तंभों में संग्रहीत मूल्यों की अखंडता, विश्वसनीयता और सटीकता को बनाए रखने में मदद करती हैं। आप CREATE TABLE या ALTER Table स्टेटमेंट का उपयोग करके बाधाएं बना सकते हैं। यदि आप ALTER TABLE स्टेटमेंट का उपयोग करते हैं, तो SQL सर्वर बाधा उत्पन्न करने से पहले मौजूदा कॉलम डेटा की जाँच करेगा।
यदि आप स्तंभ में डेटा सम्मिलित करते हैं जो बाधा नियम मानदंड को पूरा करता है, तो SQL सर्वर सफलतापूर्वक डेटा सम्मिलित करता है। हालांकि, यदि डेटा बाधा का उल्लंघन करता है, तो एक त्रुटि संदेश के साथ सम्मिलित विवरण निरस्त कर दिया जाता है।
उदाहरण के लिए, मान लें कि आपके पास एक [कर्मचारी] तालिका है जो आपके संगठन के कर्मचारी डेटा को संग्रहीत करती है, जिसमें उनका वेतन भी शामिल है। जब वेतन कॉलम में मूल्यों की बात आती है तो अंगूठे के कुछ नियम होते हैं।
- कॉलम में -10,000 या -15,000 अमरीकी डालर जैसे नकारात्मक मान नहीं हो सकते।
- आप अधिकतम वेतन मान भी निर्दिष्ट करना चाहते हैं। उदाहरण के लिए, अधिकतम वेतन 2,000,000 USD से कम होना चाहिए।
यदि आप एक बाधा के साथ एक नया रिकॉर्ड सम्मिलित करते हैं, तो SQL सर्वर परिभाषित नियमों के विरुद्ध मान को मान्य करेगा।
सम्मिलित मान:
वेतन 80,000:सफलतापूर्वक डाला गया
वेतन -50,000: त्रुटि
हम इस लेख में SQL सर्वर में निम्नलिखित बाधाओं का पता लगाएंगे।
- शून्य नहीं
- अद्वितीय
- जांच करें
- प्राथमिक कुंजी
- विदेशी कुंजी
- डिफ़ॉल्ट
पूर्ण बाधा नहीं
डिफ़ॉल्ट रूप से, SQL सर्वर कॉलम में NULL मान संग्रहीत करने की अनुमति देता है। ये NULL मान मान्य डेटा का प्रतिनिधित्व नहीं करते हैं।
उदाहरण के लिए, किसी संगठन के प्रत्येक कर्मचारी के पास एक एम्प आईडी, पहला नाम, लिंग और पता होना चाहिए। इसलिए, आप हमेशा मान्य मान सुनिश्चित करने के लिए NOT NULL बाधाओं वाला कॉलम निर्दिष्ट कर सकते हैं।
नीचे CREATE TABLE स्क्रिप्ट [ID],[FirstName],[LastName],[Gender] और [Address] कॉलम के लिए NOT NULL बाधाओं को परिभाषित करती है।
CREATE TABLE Employees ( ID INT NOT NULL, [FirstName] Varchar(100) NOT NULL, [MiddleName] Varchar(50) NULL, [LastName] Varchar(100) NOT NULL, [Gender] char(1) NOT NULL, [Address] Varchar(200) NOT NULL )
NOT NULL बाधाओं, व्यवहार को मान्य करने के लिए, हम निम्नलिखित INSERT कथनों का उपयोग करते हैं।
- सभी स्तंभों के लिए मान सम्मिलित करें (NULL और NOT NULL) – सफलतापूर्वक सम्मिलित करें
INSERT INTO Employees (ID,[FirstName],[MiddleName],[LastName],[gender],[Address]) VALUES(1,'Raj','','Gupta','M','India')
- NOT NULL प्रॉपर्टी वाले कॉलम के लिए मान डालें - सफलतापूर्वक इंसर्ट करें
INSERT INTO Employees (ID,[FirstName],[LastName],[gender],[Address]) VALUES(2, 'Shyam','Agarwal','M','UK')
- न्यूल बाधाओं वाले [अंतिम नाम] कॉलम के लिए मान सम्मिलित करना छोड़ें – विफल+
INSERT INTO Employees (ID,[FirstName],[gender],[Address]) VALUES(3,'Sneha','F','India')
पिछले INSERT कथन ने त्रुटि उत्पन्न की - कॉलम में NULL मान सम्मिलित नहीं कर सकता ।
इस तालिका में निम्नलिखित मान [कर्मचारी] तालिका में सम्मिलित हैं।
मान लीजिए कि हमें एचआर आवश्यकताओं के अनुसार [मिडिलनाम] कॉलम में NULL मानों की आवश्यकता नहीं है। इस उद्देश्य के लिए, आप ALTER TABLE स्टेटमेंट का उपयोग कर सकते हैं।
ALTER TABLE Employees ALTER COLUMN [MiddleName] VARCHAR(50) NOT NULL
[MiddleName] कॉलम के मौजूदा मानों के कारण यह ALTER TABLE स्टेटमेंट विफल हो जाता है। बाधा को लागू करने के लिए, आपको इन NULL मानों को समाप्त करना होगा और फिर ALTER कथन चलाना होगा।
UPDATE Employees SET [MiddleName]='' WHERE [MiddleName] IS NULL Go ALTER TABLE Employees ALTER COLUMN [MiddleName] VARCHAR(50) NOT NULL
आप SSMS टेबल डिज़ाइनर का उपयोग करके NOT NULL बाधाओं को भी मान्य कर सकते हैं।
अद्वितीय बाधा
SQL सर्वर में UNIQUE बाधा यह सुनिश्चित करती है कि आपके पास एकल कॉलम या कॉलम के संयोजन में डुप्लिकेट मान नहीं हैं। ये कॉलम UNIQUE बाधाओं का हिस्सा होना चाहिए। जब UNIQUE बाधाओं को परिभाषित किया जाता है, तो SQL सर्वर स्वचालित रूप से एक इंडेक्स बनाता है। आपके पास कॉलम में केवल एक अद्वितीय मान हो सकता है (NULL सहित)।
उदाहरण के लिए, UNIQUE बाधा वाले [ID] कॉलम के साथ [DemoTable] बनाएं।
CREATE TABLE DemoTable ( [ID] INT UNIQUE NOT NULL, [EmpName] VARCHAR(50) NOT NULL )
फिर, SSMS में तालिका का विस्तार करें, और आपके पास एक अद्वितीय अनुक्रमणिका (गैर-संकुल) है, जैसा कि नीचे दिखाया गया है।
कृपया अनुक्रमणिका पर राइट-क्लिक करें और इसकी स्क्रिप्ट तैयार करें। जैसा कि नीचे दिखाया गया है, यह बाधा के लिए ADD UNIQUE NONCLUSTERED कीवर्ड का उपयोग करता है।
निम्न सम्मिलित कथन एक त्रुटि देता है क्योंकि यह डुप्लिकेट मान सम्मिलित करने का प्रयास करता है।
INSERT INTO DemoTable ([ID],[EmpName]) VALUES (1,'Raj') GO INSERT INTO DemoTable ([ID],[EmpName]) VALUES (2,'Alisha') GO INSERT INTO DemoTable ([ID],[EmpName]) VALUES (1,'Raj') GO
बाधा की जांच करें
SQL सर्वर में CHECK बाधा मान की एक मान्य श्रेणी को परिभाषित करती है जिसे निर्दिष्ट कॉलम में डाला जा सकता है। यह प्रत्येक सम्मिलित या संशोधित मूल्य का मूल्यांकन करता है, और यदि यह संतुष्ट है, तो SQL कथन सफलतापूर्वक पूरा हो गया है।
निम्न SQL स्क्रिप्ट [आयु] कॉलम के लिए एक बाधा रखती है। इसका मान 18 वर्ष से अधिक होना चाहिए।
CREATE TABLE DemoCheckConstraint ( ID INT PRIMARY KEY, [EmpName] VARCHAR(50) NULL, [Age] INT CHECK (Age>18) ) GO
आइए इस तालिका में दो रिकॉर्ड डालें। क्वेरी सफलतापूर्वक पहला रिकॉर्ड सम्मिलित करती है।
INSERT INTO DemoCheckConstraint (ID,[EmpName],[Age])VALUES (1,'Raj',20) Go INSERT INTO DemoCheckConstraint (ID,[EmpName],[Age])VALUES (2,'Sohan',17) GO
दूसरा INSERT कथन विफल हो जाता है क्योंकि यह CHECK बाधा शर्त को पूरा नहीं करता है।
CHECK बाधा के लिए एक अन्य उपयोग केस ज़िप कोड के मान्य मानों को संग्रहीत करना है। नीचे की स्क्रिप्ट में, हम एक नया कॉलम [ज़िपकोड] जोड़ते हैं और यह मूल्यों को मान्य करने के लिए CHECK बाधा का उपयोग करता है।
ALTER TABLE DemoCheckConstraint ADD zipcode int GO ALTER TABLE DemoCheckConstraint ADD CONSTRAINT CK_zipcode CHECK (zipcode LIKE REPLICATE ('[0-9]', 5))
यह CHECK बाधा अमान्य ज़िप कोड की अनुमति नहीं देती है। उदाहरण के लिए, दूसरा INSERT कथन एक त्रुटि उत्पन्न करता है।
INSERT INTO DemoCheckConstraint values(3,'Sneha',19,30203) Go INSERT INTO DemoCheckConstraint values(4,'Jenny',21,122102)
प्राथमिक कुंजी बाधा
SQL सर्वर में प्राथमिक कुंजी बाधा एक संबंधपरक तालिका में अद्वितीय मूल्यों को लागू करने के लिए डेटाबेस पेशेवरों के बीच एक लोकप्रिय विकल्प है। यह UNIQUE और NOT NULL बाधाओं को जोड़ती है। एक बार जब हम प्राथमिक कुंजी बाधा को परिभाषित करते हैं तो SQL सर्वर स्वचालित रूप से एक क्लस्टर इंडेक्स बनाता है। आप एक पंक्ति में अद्वितीय मानों को परिभाषित करने के लिए एकल स्तंभ या संयोजनों के समूह का उपयोग कर सकते हैं।
इसका प्राथमिक उद्देश्य अद्वितीय इकाई या स्तंभ मान का उपयोग करके तालिका की अखंडता को लागू करना है।
यह निम्नलिखित अंतरों के साथ अद्वितीय बाधा के समान है।
प्राथमिक कुंजी | अद्वितीय कुंजी |
यह तालिका में प्रत्येक पंक्ति के लिए एक विशिष्ट पहचानकर्ता का उपयोग करता है। | यह विशिष्ट रूप से तालिका कॉलम में मानों को परिभाषित करता है। |
आप प्राथमिक कुंजी कॉलम में NULL मान नहीं डाल सकते। | यह अद्वितीय कुंजी कॉलम में एक NULL मान स्वीकार कर सकता है। |
एक तालिका में केवल एक प्राथमिक कुंजी बाधा हो सकती है। | आप SQL सर्वर में अनेक UNIQUE KEY बाधाएँ बना सकते हैं। |
डिफ़ॉल्ट रूप से, यह प्राथमिक कुंजी कॉलम के लिए क्लस्टर इंडेक्स बनाता है। | UNIQUE KEY प्राथमिक कुंजी कॉलम के लिए एक गैर-क्लस्टर इंडेक्स बनाता है। |
निम्न स्क्रिप्ट आईडी कॉलम पर प्राथमिक कुंजी को परिभाषित करती है।
CREATE TABLE PrimaryKeyDemo ( ID INT PRIMARY KEY, [Name] VARCHAR(100) NULL )
जैसा कि नीचे दिखाया गया है, आईडी कॉलम पर प्राथमिक कुंजी को परिभाषित करने के बाद आपके पास क्लस्टर कुंजी अनुक्रमणिका है।
आइए निम्नलिखित INSERT कथनों के साथ रिकॉर्ड्स को [PrimaryKeyDemo] तालिका में सम्मिलित करें।
INSERT INTO PrimaryKeyDemo ([ID],[NAME]) VALUES (1,'Raj') GO INSERT INTO PrimaryKeyDemo ([NAME]) VALUES ('Mohan') GO
आपको दूसरे INSERT कथन में त्रुटि मिलती है क्योंकि यह NULL मान डालने का प्रयास करता है।
इसी तरह, यदि आप डुप्लिकेट मान सम्मिलित करने का प्रयास करते हैं, तो आपको निम्न त्रुटि संदेश मिलता है।
विदेशी कुंजी बाधा
SQL सर्वर में FOREIGN KEY बाधा दो तालिकाओं के बीच संबंध बनाती है। इस रिश्ते को माता-पिता के रिश्ते के रूप में जाना जाता है। यह SQL सर्वर में संदर्भात्मक अखंडता को लागू करता है।
चाइल्ड टेबल फॉरेन की में पैरेंट प्राइमरी की कॉलम में संबंधित एंट्री होनी चाहिए। आप पहले मूल तालिका में सम्मिलित किए बिना चाइल्ड टेबल में मान सम्मिलित नहीं कर सकते। इसी तरह, सबसे पहले, हमें चाइल्ड टेबल से वैल्यू को हटाने की जरूरत है, इससे पहले कि इसे पैरेंट टेबल से हटाया जा सके।
चूंकि प्राथमिक कुंजी बाधा में हमारे पास डुप्लिकेट मान नहीं हो सकते हैं, यह चाइल्ड टेबल में भी डुप्लिकेट या NULL की अनुमति नहीं देता है।
निम्न SQL स्क्रिप्ट एक प्राथमिक कुंजी के साथ एक पैरेंट तालिका और मूल तालिका [EmpID] कॉलम के प्राथमिक और विदेशी कुंजी संदर्भ के साथ एक चाइल्ड टेबल बनाता है।
CREATE TABLE ParentTable ( [EmpID] INT PRIMARY KEY, [Name] VARCHAR(50) NULL ) GO CREATE TABLE ChildTable ( [ID] INT PRIMARY KEY, [EmpID] INT FOREIGN KEY REFERENCES ParentTable(EmpID) )
दोनों तालिकाओं में रिकॉर्ड डालें। ध्यान दें कि चाइल्ड टेबल फॉरेन की वैल्यू की पैरेंट टेबल में एंट्री होती है।
INSERT INTO ParentTable VALUES (1,'Raj'),(2,'Komal') INSERT INTO ChildTable VALUES (101,1),(102,2)
यदि आप सीधे चाइल्ड टेबल में एक रिकॉर्ड डालने का प्रयास करते हैं जो पैरेंट टेबल की प्राथमिक कुंजी को संदर्भित नहीं करता है, तो आपको निम्न त्रुटि संदेश मिलता है।
डिफ़ॉल्ट बाधा
SQL सर्वर में DEFAULT बाधा कॉलम के लिए डिफ़ॉल्ट मान प्रदान करती है। यदि हम DEFAULT बाधा वाले कॉलम के लिए INSERT कथन में कोई मान निर्दिष्ट नहीं करते हैं, तो SQL सर्वर अपने डिफ़ॉल्ट असाइन किए गए मान का उपयोग करता है। उदाहरण के लिए, मान लें कि ऑर्डर तालिका में सभी ग्राहकों के ऑर्डर के रिकॉर्ड हैं। आप कोई स्पष्ट मान निर्दिष्ट किए बिना ऑर्डर तिथि को कैप्चर करने के लिए GETDATE() फ़ंक्शन का उपयोग कर सकते हैं।
CREATE TABLE Orders ( [OrderID] INT PRIMARY KEY, [OrderDate] DATETIME NOT NULL DEFAULT GETDATE() ) GO
इस तालिका में रिकॉर्ड डालने के लिए, हम [ऑर्डरडेट] कॉलम के लिए मान निर्दिष्ट करना छोड़ सकते हैं।
INSERT INTO Orders([OrderID]) values (1) GO
चुनें * ऑर्डर से
एक बार जब DEFAULT बाधा कॉलम एक स्पष्ट मान निर्दिष्ट करता है, तो SQL सर्वर डिफ़ॉल्ट मान के बजाय इस स्पष्ट मान को संग्रहीत करता है।
बाधा लाभ
SQL सर्वर में बाधाएं निम्नलिखित मामलों में फायदेमंद हो सकती हैं:
- व्यावसायिक तर्क लागू करना
- संदर्भात्मक अखंडता लागू करना
- SQL सर्वर तालिकाओं में अनुचित डेटा संग्रहीत करने से रोकना
- स्तंभ डेटा के लिए अद्वितीयता लागू करना
- क्वेरी प्रदर्शन में सुधार करना क्योंकि क्वेरी ऑप्टिमाइज़र अद्वितीय डेटा के बारे में जानता है और मानों के सेट को मान्य करता है
- SQL तालिकाओं में NULL मानों को संग्रहीत करने से रोकना
- एप्लिकेशन में डेटा प्रदर्शित करते समय NULL से बचने के लिए कोड लिखना