स्वचालित मान जनरेट करें
आपको किसी विशिष्ट तालिका में एक स्तंभ के लिए स्वचालित रूप से अनुक्रमिक मान जनरेट करने की आवश्यकता हो सकती है. Transact-SQL ऐसा करने के दो तरीके प्रदान करता है: किसी तालिका में किसी विशिष्ट स्तंभ के साथ IDENTITY गुण का उपयोग करें, या कोई SEQUENCE ऑब्जेक्ट निर्धारित करें और उस ऑब्जेक्ट द्वारा जनरेट किए गए मानों का उपयोग करें.
IDENTITY गुण
IDENTITY गुण का उपयोग करने के लिए, 0 के स्केल (जिसका अर्थ केवल पूर्ण संख्याएँ हैं) के साथ सांख्यिक डेटा प्रकार का उपयोग करके स्तंभ निर्धारित करें और IDENTITY कीवर्ड शामिल करें. स्वीकार्य प्रकारों में सभी पूर्णांक प्रकार और दशमलव प्रकार शामिल हैं जहां आप स्पष्ट रूप से 0 का पैमाना देते हैं।
एक वैकल्पिक बीज (प्रारंभिक मूल्य), और एक वेतन वृद्धि (चरण मूल्य) भी निर्दिष्ट किया जा सकता है। बीज और वेतन वृद्धि को छोड़ने से वे दोनों 1 पर सेट हो जाएंगे।
नोट
IDENTITY गुण स्तंभ परिभाषा में NULL या NOT NULL निर्दिष्ट करने के स्थान पर निर्दिष्ट किया गया है। IDENTITY गुण वाला कोई भी स्तंभ स्वचालित रूप से शून्य नहीं है. आप केवल स्व-दस्तावेज़ीकरण के लिए NOT NULL निर्दिष्ट कर सकते हैं, लेकिन यदि आप कॉलम को NULL (अर्थ शून्य) के रूप में निर्दिष्ट करते हैं, तो तालिका निर्माण कथन एक त्रुटि उत्पन्न करेगा।
तालिका में केवल एक स्तंभ में IDENTITY गुण सेट हो सकता है; इसे अक्सर प्राथमिक कुंजी या वैकल्पिक कुंजी के रूप में उपयोग किया जाता है।
निम्न कोड पिछले अनुभाग उदाहरणों में उपयोग की गई Sales.Promotion तालिका का निर्माण दिखाता है, लेकिन इस बार प्राथमिक कुंजी के रूप में PromotionID नामक पहचान स्तंभ के साथ:
CREATE TABLE Sales.Promotion
(
PromotionID int IDENTITY PRIMARY KEY,
PromotionName varchar(20),
StartDate datetime NOT NULL DEFAULT GETDATE(),
ProductModelID int NOT NULL REFERENCES Production.ProductModel(ProductModelID),
Discount decimal(4,2) NOT NULL,
Notes nvarchar(max) NULL
);
नोट
CREATE TABLE स्टेटमेंट का पूरा विवरण इस मॉड्यूल के दायरे से बाहर है।
किसी पहचान स्तंभ में डेटा सम्मिलित करना
जब किसी स्तंभ के लिए IDENTITY गुण निर्धारित किया जाता है, तो तालिका में सम्मिलित कथन सामान्यतः IDENTITY स्तंभ के लिए कोई मान निर्दिष्ट नहीं करते हैं. डेटाबेस इंजिन स्तंभ के लिए अगले उपलब्ध मान का उपयोग कर मान जनरेट करता है।
उदाहरण के लिए, आप PromotionID स्तंभ के लिए कोई मान निर्दिष्ट किए बिना Sales.Promotion तालिका में कोई पंक्ति सम्मिलित कर सकते हैं:
INSERT INTO Sales.Promotion
VALUES
('Clearance Sale', '01/01/2021', 23, 0.10, '10% discount')
ध्यान दें कि भले ही मान खंड में PromotionID स्तंभ के लिए कोई मान शामिल नहीं है, फिर भी आपको सम्मिलित करें खंड में स्तंभ सूची निर्दिष्ट करने की आवश्यकता नहीं है - पहचान स्तंभ इस आवश्यकता से मुक्त हैं.
यदि यह पंक्ति तालिका में डाली गई पहली पंक्ति है, तो परिणाम इस तरह एक नई पंक्ति है:
प्रमोशन आईडी
प्रचार का नाम
प्रारंभदिनांक
ProductModelID
छूट
नोट्स
1
निकासी बिक्री
2021-01-01T00:00:00 अप्रैल 01,
23
0.1
10% छूट
जब तालिका बनाई गई थी, तो पहचान स्तंभ के लिए कोई बीज या वृद्धि मान सेट नहीं किया गया था, इसलिए पहली पंक्ति 1 के मान के साथ सम्मिलित की जाती है. सम्मिलित की जाने वाली अगली पंक्ति को 2 का PromotionID मान असाइन किया जाएगा, इत्यादि.
पहचान मान पुनर्प्राप्त करना
समान सत्र और क्षेत्र में सबसे हाल ही में असाइन किया गया पहचान मान वापस करने के लिए, SCOPE_IDENTITY फ़ंक्शन का उपयोग करें; इस तरह:
SELECT SCOPE_IDENTITY();
SCOPE_IDENTITY फ़ंक्शन किसी भी तालिका के लिए वर्तमान क्षेत्र में जनरेट किया गया सबसे हाल का पहचान मान लौटाता है. यदि आपको किसी विशिष्ट तालिका में नवीनतम पहचान मान की आवश्यकता है, तो आप IDENT_CURRENT फ़ंक्शन का उपयोग इस तरह कर सकते हैं:
SELECT IDENT_CURRENT('Sales.Promotion');
पहचान मूल्यों को ओवरराइड करना
यदि आप स्वचालित रूप से जनरेट किए गए मान को ओवरराइड करना चाहते हैं और पहचान स्तंभ को कोई विशिष्ट मान असाइन करना चाहते हैं, तो आपको पहले SET IDENTITY INSERT table_name on कथन का उपयोग करके पहचान आवेषण सक्षम करने की आवश्यकता है. इस विकल्प को सक्षम करने के साथ, आप किसी भी अन्य कॉलम की तरह ही पहचान कॉलम के लिए एक स्पष्ट मान सम्मिलित कर सकते हैं। जब आप समाप्त कर लें, तो आप स्वचालित पहचान मानों का उपयोग करके स्वचालित पहचान मानों का उपयोग फिर से शुरू करने के लिए SET IDENTITY INSERT table_name OFF कथन का उपयोग कर सकते हैं, आपके द्वारा स्पष्ट रूप से सीड के रूप में दर्ज किए गए अंतिम मान का उपयोग करके।
SET IDENTITY_INSERT SalesLT.Promotion ON;
INSERT INTO SalesLT.Promotion (PromotionID, PromotionName, ProductModelID, Discount)
VALUES
(20, 'Another short sale',37, 0.3);
SET IDENTITY_INSERT SalesLT.Promotion OFF;
जैसा कि आपने सीखा है, IDENTITY गुण का उपयोग तालिका के भीतर किसी स्तंभ के लिए मानों का अनुक्रम जनरेट करने के लिए किया जाता है. हालाँकि, IDENTITY गुण डेटाबेस में एकाधिक तालिकाओं में मानों के समन्वय के लिए उपयुक्त नहीं है. उदाहरण के लिए, मान लें कि आपका संगठन पुनर्विक्रेताओं को प्रत्यक्ष विक्रय और विक्रय के बीच अंतर करता है और इन बिक्रियों के लिए डेटा को अलग-अलग तालिकाओं में संग्रहीत करना चाहता है. दोनों प्रकार की बिक्री के लिए अनन्य इनवॉइस संख्या की आवश्यकता हो सकती है और हो सकता है कि आप दो भिन्न प्रकार की बिक्री के लिए समान मान की प्रतिलिपि बनाने से बचना चाहें. इस आवश्यकता के लिए एक समाधान दोनों तालिकाओं में अद्वितीय अनुक्रमिक मानों का एक पूल बनाए रखना है।
एक पहचान स्तंभ को फिर से सीड करना
कभी-कभी, आपको स्तंभ के लिए पहचान मानों को रीसेट या छोड़ना होगा. ऐसा करने के लिए, आप DBCC CHECKIDENT फ़ंक्शन का उपयोग करके कॉलम को "रीसीडिंग" करेंगे। आप इसका उपयोग कई मानों को छोड़ने के लिए कर सकते हैं, या तालिका में सभी पंक्तियों को हटाने के बाद अगले पहचान मान को 1 पर रीसेट कर सकते हैं। DBCC CHECKIDENT का उपयोग करके पूर्ण विवरण के लिए, Transact-SQL संदर्भ दस्तावेज़ देखें।
अनुक्रम
Transact-SQL में, आप किसी विशिष्ट तालिका से स्वतंत्र रूप से नए अनुक्रमिक मानों को परिभाषित करने के लिए अनुक्रम ऑब्जेक्ट का उपयोग कर सकते हैं। वैकल्पिक रूप से डेटा प्रकार (0 के पैमाने के साथ पूर्णांक प्रकार या दशमलव या सांख्यिक होना चाहिए), प्रारंभिक मान, एक वृद्धि मान, एक अधिकतम मान और प्रदर्शन से संबंधित अन्य विकल्पों की आपूर्ति करते हुए, CREATE SEQUENCE कथन का उपयोग करके एक अनुक्रम ऑब्जेक्ट बनाया जाता है।
CREATE SEQUENCE Sales.InvoiceNumber AS INT
START WITH 1000 INCREMENT BY 1;
अनुक्रम से अगला उपलब्ध मान पुनर्प्राप्त करने के लिए, निर्माण के लिए अगला मान का उपयोग करें, इस तरह:
INSERT INTO Sales.ResellerInvoice
VALUES
(NEXT VALUE FOR Sales.InvoiceNumber, 2, GETDATE(), 'PO12345', 107.99);
पहचान या अनुक्रम
स्वतः-पॉप्युलेटिंग मानों के लिए IDENTITY स्तंभों या SEQUENCE ऑब्जेक्ट का उपयोग करने का निर्णय लेते समय, निम्न बिंदुओं को ध्यान में रखें:
यदि आपके अनुप्रयोग को एकाधिक तालिकाओं या किसी तालिका के भीतर एकाधिक स्तंभों के बीच संख्याओं की एकल श्रृंखला साझा करने की आवश्यकता है, तो अनुक्रम का उपयोग करें.
अनुक्रम आपको मानों को किसी अन्य कॉलम द्वारा सॉर्ट करने की अनुमति देता है। NEXT FOR BUILD स्तंभ सॉर्ट करने के लिए OVER क्लॉज का उपयोग कर सकता है. ओवर क्लॉज गारंटी देता है कि लौटाए गए मान ओवर क्लॉज के ऑर्डर बाय क्लॉज के क्रम में उत्पन्न होते हैं। यह कार्यक्षमता आपको पंक्तियों के लिए पंक्ति संख्या उत्पन्न करने की भी अनुमति देती है क्योंकि वे एक चयन में लौटाए जा रहे हैं। निम्न उदाहरण में, Production.Product तालिका नाम स्तंभ द्वारा सॉर्ट किया गया है, और पहले दिया गया स्तंभ अनुक्रमिक संख्या है।
SELECT NEXT VALUE FOR dbo.Sequence OVER (ORDER BY Name) AS NextID, ProductID, Name FROM Production.Product;भले ही पिछला कथन प्रदर्शित करने के लिए केवल अनुक्रम मानों का चयन कर रहा था, मान अभी भी 'उपयोग किए गए' हैं और प्रदर्शित अनुक्रम मान अब उपलब्ध नहीं होंगे। यदि आप उपरोक्त SELECT को कई बार चलाते हैं, तो आपको हर बार अलग-अलग SEQUENCE मान मिलेंगे।
अनुक्रम का उपयोग करें यदि आपके आवेदन को एक ही समय में कई संख्याओं को असाइन करने की आवश्यकता है। उदाहरण के लिए, एक एप्लिकेशन को पांच अनुक्रमिक संख्याओं को आरक्षित करने की आवश्यकता होती है। पहचान मानों का अनुरोध करने से श्रृंखला में अंतराल हो सकता है यदि अन्य प्रक्रियाओं को एक साथ संख्याएं जारी की गई थीं। आप अनुक्रम में कई संख्याओं को एक साथ पुनर्प्राप्त करने के लिए sp_sequence_get_range सिस्टम प्रक्रिया का उपयोग कर सकते हैं।
SEQUENCE आपको अनुक्रम के विनिर्देश को बदलने की अनुमति देता है, जैसे कि वृद्धि मान।
पहचान मान अद्यतनों से सुरक्षित हैं। अगर आप IDENTITY प्रॉपर्टी वाले कॉलम को अपडेट करने की कोशिश करते हैं, तो आपको एक गड़बड़ी मिलेगी.