Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर अद्वितीय बाधाओं में अंतर्दृष्टि

अद्वितीय कुंजी बाधाएं क्या हैं?

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

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

एक अद्वितीय बाधा बनाना

निम्न नमूना क्वेरी विद्यार्थी बनाती है तालिका और लॉगिन . पर एक अद्वितीय बाधा कॉलम ताकि एक ही लॉगिन वाले कोई छात्र न हों।

CREATE TABLE Students (
Login CHAR NOT NULL
,CONSTRAINT AK_Student_Login UNIQUE (Login)
);
GO

अगर छात्र तालिका पहले से मौजूद है, तो आप अद्वितीय बाधा बनाने के लिए निम्न नमूना क्वेरी का उपयोग कर सकते हैं।

ALTER TABLE Students
ADD CONSTRAINT AK_Student_Login UNIQUE (Login);
GO

ध्यान दें कि जब आप किसी मौजूदा तालिका में एक अद्वितीय बाधा जोड़ते हैं, तो डेटाबेस इंजन सत्यापित करता है कि जिस स्तंभ में बाधा जोड़ी गई है उसमें डुप्लिकेट मान शामिल हैं या नहीं। यदि ऐसे मान हैं, तो त्रुटि लौटाते हुए बाधा नहीं जोड़ी जाएगी।

अब, यह सत्यापित करने के लिए कि अद्वितीय बाधा वास्तव में जोड़ी गई है, निम्नलिखित कथनों को निष्पादित करें:

EXEC sp_helpindex Students

EXEC sp_helpconstraint Students

यहां हमारे द्वारा बनाई गई बाधा है:

SQL सर्वर प्रबंधन स्टूडियो में एक अद्वितीय बाधा बनाना

मान लें कि हमें लॉगिन . पर एक अद्वितीय बाधा को परिभाषित करने की आवश्यकता है इसे विद्यार्थी . कॉलम करें टेबल।

1. ऑब्जेक्ट एक्सप्लोरर . में , विद्यार्थी . पर राइट-क्लिक करें तालिका और क्लिक करें डिज़ाइन

2. टेबल डिज़ाइनर पर राइट-क्लिक करें और इंडेक्स/कुंजी… . चुनें

3. इंडेक्स/कुंजी . में विंडो में, जोड़ें click क्लिक करें ।

4. सामान्य . के अंतर्गत अनुभाग में, कॉलम . क्लिक करें और फिर इलिप्सिस बटन पर क्लिक करें। इंडेक्स कॉलम . में विंडो में, उस कॉलम का चयन करें जिसे आप अद्वितीय बाधा में शामिल करना चाहते हैं।

5. सामान्य . के अंतर्गत अनुभाग में, टाइप करें . क्लिक करें और अद्वितीय कुंजी select चुनें ड्रॉप-डाउन सूची से।

6. पहचान . के अंतर्गत अनुभाग, बाधा का नाम निर्दिष्ट करें (हमारे मामले में, AK_Student_Login ) और बंद करें . क्लिक करें नव निर्मित बाधा को बचाने के लिए।

अब, यदि आप विद्यार्थियों . के पास जाते हैं ऑब्जेक्ट एक्सप्लोरर में तालिका और अनुक्रमणिका . क्लिक करें फ़ोल्डर, आप देखेंगे कि तालिका में एक प्राथमिक कुंजी और एक अद्वितीय बाधा है AK_Student_Login

अनन्य बाधाएँ प्राथमिक कुंजियों से किस प्रकार भिन्न हैं?

एक अद्वितीय बाधा के समान, किसी तालिका में डेटा अखंडता को लागू करने के लिए प्राथमिक कुंजी का भी उपयोग किया जाता है। लेकिन प्राथमिक कुंजी का प्राथमिक उद्देश्य तालिका में प्रत्येक रिकॉर्ड को विशिष्ट रूप से पहचानना और डेटाबेस में तालिकाओं के बीच उचित संबंधों को लागू करना है। तालिका पंक्तियों तक उचित पहुंच की अनुमति देने के लिए 99% तालिकाओं में प्राथमिक कुंजी की आवश्यकता होती है। एक या एक से अधिक स्तंभों पर परिभाषित प्रति तालिका केवल एक प्राथमिक कुंजी हो सकती है।

अद्वितीय बाधाओं का उपयोग विशेष रूप से डुप्लिकेट मानों को कॉलम में डालने से रोकने के लिए किया जाता है। अद्वितीय बाधाओं के साथ कई कॉलम हो सकते हैं या किसी तालिका पर परिभाषित कोई अद्वितीय बाधा नहीं हो सकती है। प्राथमिक कुंजियों के विपरीत वे तालिका के लिए अनिवार्य नहीं हैं।

मान लें, हमारे पास विद्यार्थी . हैं एक विश्वविद्यालय में प्रत्येक छात्र के बारे में व्यक्तिगत जानकारी वाली तालिका। तालिका में StudentID . शामिल है कॉलम जो एक प्राथमिक कुंजी है और प्रत्येक विशिष्ट छात्र की एक विशिष्ट आईडी संग्रहीत करता है। इस प्राथमिक कुंजी कॉलम का उपयोग विश्वविद्यालय में प्रत्येक छात्र की विशिष्ट पहचान के लिए किया जाता है।

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

एक और बात जो प्राथमिक कुंजी से एक अद्वितीय बाधा को अलग करती है वह यह है कि प्राथमिक कुंजी किसी भी NULL की अनुमति नहीं देती है एक कॉलम में मान, जबकि एक अद्वितीय बाधा वाले कॉलम में एक NULL . शामिल हो सकता है मान लेकिन केवल एक क्योंकि SQL सर्वर दो NULL मानों को समान मान के रूप में व्याख्या करता है।

मान लीजिए कि ईमेल . पर एक अद्वितीय बाधा बनाई गई है छात्रों . का स्तंभ टेबल। आइए NULL . दोनों के साथ दो पंक्तियों को सम्मिलित करने का प्रयास करें ईमेल . में फ़ील्ड:

INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)

VALUES (1, 'John White', 19, NULL, 123-45-6789, 'John555')

GO
INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)

VALUES (2, 'James Marvin', 21, NULL, 987-65-4321, 'Marvin_J17')

GO

हमें निम्न त्रुटि संदेश मिलता है:

खैर, यह एक अनुमानित व्यवहार है, क्योंकि डुप्लिकेट मान, भले ही वे NULL हों, अद्वितीय बाधा द्वारा अनुमति नहीं है।

अद्वितीय बाधा बनाम अद्वितीय अनुक्रमणिका

हालांकि दोनों अद्वितीय बाधा और अद्वितीय अनुक्रमणिका दो पूरी तरह से अलग असंबंधित डेटाबेस इकाइयां हैं, उनका एक ही लक्ष्य है और SQL सर्वर प्रदर्शन पर समान प्रभाव पड़ता है। वे दोनों एक कॉलम में डेटा की विशिष्टता सुनिश्चित करते हैं।

हालांकि, अद्वितीय अनुक्रमणिका के विपरीत, आप IGNORE_DUP_KEY, DROP_EXISTING, PAD_INDEX और STATISTICS_NORECOMPUTE विकल्पों को ALTER TABLE कथनों में अद्वितीय बाधा के लिए निर्दिष्ट नहीं कर सकते।

जब आप किसी स्तंभ पर एक अद्वितीय बाधा बनाते हैं, तो SQL सर्वर स्वचालित रूप से स्तंभ पर एक अद्वितीय अनुक्रमणिका बनाता है, इस प्रकार यह सुविधा SQL सर्वर में लागू की जाती है।

अद्वितीय अनुक्रमणिका को हटाने के लिए, आपको पहले संबंधित अनन्य बाधा को छोड़ना होगा और यह स्वतः अंतर्निहित अद्वितीय अनुक्रमणिका को हटा देगा।

निम्न कथन AK_Student_Login को छोड़ देगा बाधा:

ALTER TABLE Students 
DROP CONSTRAINT AK_Student_Login; 
GO

आप देख सकते हैं कि AK_Student_Login . को छोड़ना अद्वितीय बाधा इसकी संबंधित अनुक्रमणिका को हटा देती है।

यह आसान था, अब आप लॉगिन . में समान मान सम्मिलित कर सकते हैं कॉलम।

अद्वितीय प्रतिबंध को अक्षम करना

एक विकल्प है जो एक अद्वितीय बाधा को अक्षम करता है। निम्न क्वेरी सभी तालिका बाधाओं को अक्षम करने वाली है:

ALTER TABLE Students
NOCHECK CONSTRAINT ALL
GO

क्वेरी को निष्पादित करने के बाद, आइए अब एक डुप्लीकेटिंग रिकॉर्ड डालने का प्रयास करें:

INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)
VALUES (3, 'John White', 19, NULL, 123-45-6789, 'John555')
GO

हमें जो मिलता है वह अद्वितीय बाधा उल्लंघन संदेश है:

इस प्रकार, ऐसा प्रतीत होता है कि ALTER TABLE

NOCHECK CONSTRAINT ALL GO SQL सर्वर में अद्वितीय बाधाओं के लिए काम नहीं करता है।

हालांकि, याद रखें कि प्रत्येक अद्वितीय बाधा के हुड के नीचे एक अद्वितीय अनुक्रमणिका है, और हमें एक अद्वितीय अनुक्रमणिका को अक्षम करने में सक्षम होना चाहिए। हमारे मामले में, AK_Student_Email अद्वितीय बाधा ने संबंधित AK_Student_Email बनाया है ईमेल . पर अद्वितीय अनुक्रमणिका कॉलम। आइए AK_Student_Email . को अक्षम करने के लिए निम्न क्वेरी का उपयोग करें अद्वितीय अनुक्रमणिका पहले।

ALTER INDEX AK_Student_Email ON Students
DISABLE;

क्वेरी सफलतापूर्वक पूरी हो गई है, इसलिए अब दो रिकॉर्ड को डुप्लिकेट ईमेल . के साथ सम्मिलित करें छात्रों . में फ़ील्ड टेबल।

INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)
VALUES (3, 'John White', 19, '[email protected]', 123-45-6789, 'John555')
GO
INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)
VALUES (4, 'James Marvin', 21, '[email protected]', 987-65-4321, 'Marvin_J17')
GO

यह काम करता हैं! रिकॉर्ड तालिका में डाले गए हैं! अब हम जानते हैं कि इस "अक्षमता" मुद्दे को एक अद्वितीय बाधा के साथ कैसे हल किया जाए।

अनुक्रमणिका को सक्षम करने के लिए, निम्न क्वेरी का उपयोग करें:

ALTER INDEX AK_Student_Email ON Students
REBUILD;

निष्कर्ष

अद्वितीय कुंजी बाधाएं डीबीए और एसक्यूएल डेवलपर्स को टेबल कॉलम में डेटा विशिष्टता को लागू करने और संरक्षित करने के साथ-साथ डेटा अखंडता के लिए कुछ व्यावसायिक आवश्यकताओं को लागू करने की अनुमति देती हैं। मूल रूप से, एक अद्वितीय बाधा और एक अद्वितीय सूचकांक के बीच व्यवहार में कोई महत्वपूर्ण अंतर नहीं है, इस तथ्य को छोड़कर कि अद्वितीय बाधा को सीधे अक्षम नहीं किया जा सकता है और कुछ अनुक्रमणिका निर्माण विकल्प ALTER TABLE कथन में अद्वितीय बाधाओं के लिए उपलब्ध नहीं हैं।

आशा है कि यह लेख दिलचस्प था। आप इस लेख से संबंधित प्रश्न पूछ सकते हैं, टिप्पणी और सुझाव छोड़ सकते हैं।

यह भी देखें: SQL सर्वर में बाधाओं की जाँच करें


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. जांचें कि क्या तालिका में OBJECTPROPERTY () के साथ SQL सर्वर में टाइमस्टैम्प कॉलम है

  2. SQL सर्वर अप्रयुक्त सूचकांक

  3. UPDLOCK, होल्डलॉक के बारे में उलझन में

  4. SQL सर्वर में तालिका बनाने के लिए कथन बनाएँ का उपयोग करें - SQL सर्वर / T- SQL ट्यूटोरियल भाग 34

  5. क्या Microsoft SQL सर्वर पर SQL क्वेरी के लिए टाइमआउट सेट करना संभव है?

© कॉपीराइट http://hi.sqldat.com सर्वाधिकार सुरक्षित