हम एसक्यूएल सर्वर चला रहे हैं 2012 SP1 x64 (11.0.3000.0)एसक्यूएल सर्वर: प्राथमिक कुंजी
के मनमाने ढंग से ऑटो वेतन वृद्धि मैं ऑटो incrementing के रूप में InvoiceId
क्षेत्र, प्राथमिक कुंजी के साथ निम्न तालिका:
CREATE TABLE Orders(
InvoiceId bigint IDENTITY(1001,1) NOT FOR REPLICATION,
OrderId varchar(8) NOT NULL,
... -- other fields removed for brevity
CONSTRAINT [PK_ORDERS] PRIMARY KEY CLUSTERED (InvoiceId)
ON [PRIMARY],
)
नई पंक्तियों डाला जाता है, हालांकि की तरह एक साधारण संग्रहीत प्रक्रिया के बाद:
SET XACT_ABORT ON
SET NOCOUNT ON
BEGIN TRANSACTION
INSERT INTO Orders(
OrderId,
... -- other fields removed for brevity
)
VALUES (
@orderId,
...
)
SELECT @newRowId = SCOPE_IDENTITY()
COMMIT TRANSACTION
ऊपर sproc रिटर्न पंक्ति-आईडी नव निर्मित (Orders.InvoiceId
) कॉलर के लिए।
कोड [InvoiceId]
1001 से शुरू करने और प्रत्येक उत्तरोत्तर आवेषण के लिए 1 से incrementing के साथ पूरी तरह काम कर रहा था,।
हमारे उपयोगकर्ताओं को लगभग 130 पंक्तियाँ सम्मिलित किया गया। [InvoiceId]
1130 में किया गया था, तो अगले डालने पर अपने मूल्य पर पहुंच!
मैं क्या सिर्फ यहाँ क्या हुआ है के रूप में विस्मित कर रहा हूँ:
यहाँ डेटा स्क्रीनशॉट है। ऑटो-इंक काउंटर अचानक 10,000 अंक क्यों छोड़ गया?
हम बारकोड उत्पन्न करने के लिए [InvoiceId]
के मान का उपयोग कर रहे हैं, इसलिए हम मूल्य को एक विशिष्ट श्रृंखला में रहना पसंद करेंगे, अधिमानतः एक संगत श्रृंखला में।
मैं T-SQL प्रलेखन अवलोकन लेकिन मेरी समस्या से संबंधित कुछ भी खोजने में असफल रहा है। क्या यह पहचान क्षेत्र का सामान्य व्यवहार (मनमाना आबादी) है?
अद्यतन धन्यवाद Marting & एरन के लिए, मैं एक काम के आसपास पाया है। यहाँ official response Microsoft से है:
एसक्यूएल सर्वर 2012 में पहचान संपत्ति के कार्यान्वयन अन्य सुविधाओं में निवेश की सुविधा के लिए बदल दिया गया है। SQL सर्वर के पिछले संस्करणों में पहचान पीढ़ी की ट्रैकिंग उत्पन्न प्रत्येक पहचान मूल्य के लिए लेन-देन लॉग रिकॉर्ड पर भरोसा किया। एसक्यूएल सर्वर 2012 में हम बैचों में पहचान मूल्यों पैदा करते हैं और केवल बैच की अधिकतम मूल्य लॉग इन करें। इससे की लेन-देन लॉग में लिखी गई जानकारी स्केलेबिलिटी में सुधार की मात्रा और आवृत्ति को कम कर देता है।
आप एक ही पहचान पीढ़ी अर्थ विज्ञान की आवश्यकता के रूप में एसक्यूएल सर्वर के पिछले संस्करणों दो विकल्प उपलब्ध हैं, तो:
• उपयोग ट्रेस ध्वज 272 ओ इस कारण होगा एक लॉग रिकॉर्ड प्रत्येक उत्पन्न पहचान के लिए उत्पन्न करने मूल्य। पहचान उत्पादन का प्रदर्शन इस ट्रेस ध्वज को चालू करके प्रभावित हो सकता है।
उपयोग • कोई कैश सेटिंग (http://msdn.microsoft.com/en-us/library/ff878091.aspx) ओ यह साथ एक दृश्य जनरेटर एक लॉग रिकॉर्ड प्रत्येक उत्पन्न अनुक्रम मूल्य के लिए उत्पन्न होने का कारण होगा। ध्यान दें कि अनुक्रम मूल्य निर्माण का प्रदर्शन कोई कैच का उपयोग करके प्रभावित हो सकता है।
उदाहरण:
CREATE SEQUENCE s1 AS INT START WITH 1 NO CACHE;
CREATE TABLE t1 (Id INT PRIMARY KEY DEFAULT NEXT VALUE FOR s1, col INT NOT NULL);
'IDENTITY' सन्निहित गारंटी नहीं है, लेकिन वर्ष 2012 में जहां यह अचानक सेवा पुनरारंभ करने के बाद बड़े अंतराल छोड़ने कूद कर सकते हैं में एक ज्ञात समस्या है। –
धन्यवाद @ मार्टिनस्मिथ! यह मेरे मामले में मुद्दा लगता है। मुझे पहचान वृद्धि कूदने से पहले डीबी मशीन को रिबूट करना याद है! मैं इससे कैसे बच सकता हूं? – masroore
आप निश्चित रूप से इससे बच नहीं सकते क्योंकि संगतता की गारंटी कभी नहीं दी गई थी, लेकिन एक ट्रेस ध्वज है जिसे आप धीरे-धीरे (लॉग) 2008 व्यवहार प्राप्त करने के लिए सेट कर सकते हैं या आप छोटे कैश आकार के साथ अनुक्रम का उपयोग कर सकते हैं। [यहां चर्चा] देखें [https://connect.microsoft.com/SQLServer/feedback/details/739013/failover-or-restart-results-in-reseed-of-identity) –