प्रश्न को SQL Server 2000 टैग किया गया है, लेकिन नवीनतम संस्करण पर विकसित होने वाले लोगों के लाभ के लिए मैं इसे पहले संबोधित करूंगा।
एसक्यूएल सर्वर 2014
SQL सर्वर 2014 के नीचे चर्चा की गई बाधा आधारित अनुक्रमणिका को जोड़ने के तरीकों के अलावा गैर-अद्वितीय अनुक्रमणिका को तालिका चर घोषणाओं पर सीधे इनलाइन सिंटैक्स के साथ निर्दिष्ट करने की अनुमति देता है।
उसके लिए उदाहरण वाक्य रचना नीचे है।
/*SQL Server 2014+ compatible inline index syntax*/
DECLARE @T TABLE (
C1 INT INDEX IX1 CLUSTERED, /*Single column indexes can be declared next to the column*/
C2 INT INDEX IX2 NONCLUSTERED,
INDEX IX3 NONCLUSTERED(C1,C2) /*Example composite index*/
);
फ़िल्टर किए गए अनुक्रमणिका और अनुक्रमणिका शामिल स्तंभों के साथ वर्तमान में इस सिंटैक्स के साथ घोषित नहीं किए जा सकते हैं, हालांकि SQL Server 2016 इसे थोड़ा और आराम देता है। सीटीपी 3.1 से अब टेबल वेरिएबल के लिए फ़िल्टर्ड इंडेक्स घोषित करना संभव है। आरटीएम द्वारा यह हो सकता है ऐसा मामला हो जिसमें कॉलम शामिल हैं, लेकिन वर्तमान स्थिति यह है कि वे "संसाधन बाधाओं के कारण इसे SQL16 में नहीं बना पाएंगे"
/*SQL Server 2016 allows filtered indexes*/
DECLARE @T TABLE
(
c1 INT NULL INDEX ix UNIQUE WHERE c1 IS NOT NULL /*Unique ignoring nulls*/
)
एसक्यूएल सर्वर 2000 - 2012
<ब्लॉकक्वॉट>क्या मैं नाम पर एक अनुक्रमणिका बना सकता हूँ?
संक्षिप्त उत्तर:हाँ।
DECLARE @TEMPTABLE TABLE (
[ID] [INT] NOT NULL PRIMARY KEY,
[Name] [NVARCHAR] (255) COLLATE DATABASE_DEFAULT NULL,
UNIQUE NONCLUSTERED ([Name], [ID])
)
अधिक विस्तृत उत्तर नीचे है।
SQL सर्वर में पारंपरिक तालिकाओं में या तो एक संकुल अनुक्रमणिका हो सकती है या ढेर के रूप में संरचित होती है।
डुप्लिकेट कुंजी मानों को अस्वीकार करने के लिए क्लस्टर किए गए इंडेक्स को या तो अद्वितीय घोषित किया जा सकता है या गैर अद्वितीय के लिए डिफ़ॉल्ट घोषित किया जा सकता है। यदि अद्वितीय नहीं है, तो SQL सर्वर किसी भी डुप्लीकेट कुंजी को अद्वितीय बनाने के लिए चुपचाप एक यूनीफायर जोड़ देता है।
गैर-संकुल अनुक्रमणिका को भी स्पष्ट रूप से अद्वितीय घोषित किया जा सकता है। अन्यथा गैर अद्वितीय मामले के लिए SQL सर्वर सभी अनुक्रमणिका कुंजियों (न केवल डुप्लिकेट) के लिए पंक्ति लोकेटर (क्लस्टर इंडेक्स कुंजी या एक ढेर के लिए RID) जोड़ता है, यह फिर से सुनिश्चित करता है कि वे अद्वितीय हैं।
SQL Server 2000 - 2012 में तालिका चर पर अनुक्रमणिका केवल UNIQUE
बनाकर परोक्ष रूप से बनाई जा सकती हैं या PRIMARY KEY
बाधा इन बाधा प्रकारों के बीच अंतर यह है कि प्राथमिक कुंजी गैर-शून्य कॉलम पर होनी चाहिए। एक अद्वितीय बाधा में भाग लेने वाले कॉलम अशक्त हो सकते हैं। (यद्यपि SQL सर्वर द्वारा NULL
. की उपस्थिति में अद्वितीय बाधाओं का कार्यान्वयन s SQL मानक में निर्दिष्ट के अनुसार नहीं है)। साथ ही एक तालिका में केवल एक प्राथमिक कुंजी हो सकती है लेकिन कई अद्वितीय बाधाएं हो सकती हैं।
इन दोनों तार्किक बाधाओं को एक अद्वितीय सूचकांक के साथ भौतिक रूप से कार्यान्वित किया जाता है। यदि स्पष्ट रूप से निर्दिष्ट नहीं किया गया है अन्यथा PRIMARY KEY
क्लस्टर इंडेक्स और अद्वितीय बाधाएं गैर क्लस्टर बन जाएंगी लेकिन इस व्यवहार को CLUSTERED
निर्दिष्ट करके ओवरराइड किया जा सकता है या NONCLUSTERED
स्पष्ट रूप से बाधा घोषणा के साथ (उदाहरण वाक्य रचना)
DECLARE @T TABLE
(
A INT NULL UNIQUE CLUSTERED,
B INT NOT NULL PRIMARY KEY NONCLUSTERED
)
उपरोक्त के परिणामस्वरूप निम्न अनुक्रमणिका SQL Server 2000 - 2012 में तालिका चर पर अंतर्निहित रूप से बनाई जा सकती हैं।
+-------------------------------------+-------------------------------------+
| Index Type | Can be created on a table variable? |
+-------------------------------------+-------------------------------------+
| Unique Clustered Index | Yes |
| Nonunique Clustered Index | |
| Unique NCI on a heap | Yes |
| Non Unique NCI on a heap | |
| Unique NCI on a clustered index | Yes |
| Non Unique NCI on a clustered index | Yes |
+-------------------------------------+-------------------------------------+
अंतिम को थोड़ा स्पष्टीकरण की आवश्यकता है। इस उत्तर की शुरुआत में तालिका चर परिभाषा में गैर अद्वितीय Name
. पर गैर संकुल अनुक्रमणिका एक अद्वितीय . द्वारा सिम्युलेटेड है Name,Id
पर अनुक्रमणिका (याद रखें कि SQL सर्वर वैसे भी गैर-विशिष्ट NCI कुंजी में चुपचाप संकुल अनुक्रमणिका कुंजी जोड़ देगा)।
मैन्युअल रूप से एक IDENTITY
जोड़कर एक गैर-अद्वितीय क्लस्टर इंडेक्स भी प्राप्त किया जा सकता है एक अद्वितीय के रूप में कार्य करने के लिए कॉलम।
DECLARE @T TABLE
(
A INT NULL,
B INT NULL,
C INT NULL,
Uniqueifier INT NOT NULL IDENTITY(1,1),
UNIQUE CLUSTERED (A,Uniqueifier)
)
लेकिन यह एक सटीक अनुकरण नहीं है कि कैसे एक गैर अद्वितीय क्लस्टर इंडेक्स वास्तव में SQL सर्वर में वास्तव में कार्यान्वित किया जाएगा क्योंकि यह सभी पंक्तियों में "अद्वितीय" जोड़ता है। केवल वे ही नहीं जिन्हें इसकी आवश्यकता है।