2011-01-31 11 views
6

डालें मैं SQL सर्वर में एक तालिका से निपट रहा हूं जिसमें serial_no कॉलम है, जिसे एक गैर शून्य int के रूप में परिभाषित किया गया है। यह एक ऑटो incrementing फ़ील्ड प्रतीत नहीं होता है, जैसे कि मैं उस कॉलम को अपने सम्मिलन कथन से बाहर छोड़ देता हूं, मुझे यह कहते हुए एक त्रुटि मिलती है कि serial_no फ़ील्ड शून्य नहीं हो सकता है।एसक्यूएल सर्वर: अगले उपलब्ध int

तो मैं अगले उपलब्ध नंबर को कैसे सम्मिलित करूं?

मैं इस कोशिश की:

INSERT INTO mytable (serial_no) VALUES ((SELECT MAX(serial_no)+1 FROM mytable)) 

लेकिन मैं कह रही है कि सबक्वेरी इस संदर्भ में नहीं किया जा सकता कोई त्रुटि मिलती है।

संपादित करें: यह तालिका शेल्फ उत्पाद के बंद में उपयोग की जाती है, इसलिए मैं डिज़ाइन को बदल नहीं सकता और serial_no कॉलम को ऑटो वृद्धि नहीं कर सकता।

+0

क्या यह सभी पंक्तियों में अद्वितीय होना चाहिए ?? उत्तरों में अनुशंसित दृष्टिकोण आमतौर पर समवर्ती-सुरक्षित नहीं होते हैं, उदा। आप डुप्लिकेट के साथ समाप्त हो सकते हैं ..... आपको या तो एक की आवश्यकता है) इसे 'पहचान पहचान' कॉलम बनाएं और SQL सर्वर को इसके बारे में चिंता करने दें, बी) obviuos 'SELECT MAX (serial_no) + से बहुत अधिक काम करें 1', या सी) SQL सर्वर 2011 के लिए प्रतीक्षा करें और 'SEQUENCES' –

+0

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

+1

क्या आप यह निर्धारित करने के लिए एक ट्रेस चला सकते हैं कि तृतीय पक्ष एप्लिकेशन मूल्य कैसे बनाता है और बस वही करता है? मैं कहूंगा कि यदि कोई पहचान कॉलम नहीं है तो वे अगले मूल्य को रखने के लिए तालिका का उपयोग कर रहे हैं। एक ऐसा उत्तर है जो पहले से ही इस तकनीक का उल्लेख करता है। इस MAX() + 1 दृष्टिकोण के साथ डुप्लिकेट की संभावना का उल्लेख करने के लिए –

उत्तर

9

आप ताला लगा संकेत

साथ लिखने संगामिति सुधार कर सकते हैं

प्रदर्शन महत्वपूर्ण is't हैं, तो TABLOCKX चप्पू-आंकड़ा के स्थान पर, XLOCK

, कोशिश हालांकि दिया इस सुरक्षित नहीं है या तो आप

DECLARE @retry bit 
SET @retry = 1 

WHILE @Retry = 1 
BEGIN 
    BEGIN TRY 
     INSERT INTO mytable (serial_no, value) 
     SELECT MAX (serial_no)+1, @value 
     FROM mytable WITH (ROWLOCK, XLOCK, HOLDLOCK) 

     SET @Retry = 0 
    END TRY 
    BEGIN CATCH 
     IF ERROR_NUMBER() <> 2627 --PK violation 
      RAISERROR ('blah', 16, 1) 
    END CATCH 
END 

पुनः प्रयास करें या एक पहचान स्तंभ के लिए बदलने की जरूरत है और इसे ठीक से करें ...

+1

+1, हालांकि आपकी अंतिम पंक्ति ** बोल्ड ** वास्तव में होनी चाहिए। – cjk

+0

पहचान जब संभव हो तो सबसे अच्छा विकल्प है। हालांकि, ऐसे मामले हैं जहां मैन्युअल रूप से प्रबंधित अद्वितीय कुंजी की आवश्यकता होती है। यह मामला तब होता है जब मैं अभी हूं। एक क्लाइंट एक अद्वितीय फ़ाइल नम्बर चाहता है, जो अनुक्रमिक है, उपयोगकर्ता संपादन योग्य है, और प्रत्येक वर्ष अनुक्रम की शुरुआत में परिवर्तन करता है – George

+0

@ जॉर्ज: अब हमारे पास इस प्रकार की सामग्री के लिए SQL Server 2012 में अनुक्रम हैं – gbn

2

त्रुटि मान

INSERT INTO mytable (serial_no, value) 

SELECT MAX(serial_no)+1 , 
@value 
FROM mytable) 

छोड़ने के द्वारा ठीक किया जा सकता लेकिन यह एक बुरा विचार है। MAX (serial_no) +1 पर एक रेस शर्त है (उदाहरण के लिए दो इन्सर्ट मैक्स (Serial_no) के लिए समान मान प्राप्त करते हैं।

आप ऑटो वृद्धि क्षेत्र का उपयोग करके बेहतर हैं। आप एक टेबल भी बना सकते हैं जो वर्तमान स्टोर करता है अगले मूल्य और यह बजाय अधिकतम उपयोग करने का बढ़ा देते

+1

+1; और ऑटो-वृद्धि समाधान –

+0

समस्या का सुझाव यह है कि यह मेरी तालिका या एप्लिकेशन नहीं है। मैं इसे बदल नहीं सकता –

0
INSERT INTO mytable (serial_no) SELECT MAX(serial_no)+1 FROM mytable 
+1

सुरक्षित नहीं है - डुप्लिकेट के साथ समाप्त हो सकता है, यदि दो INSERT लगभग एक ही समय में दो कनेक्शन से होता है .... –

0

मान के बिना यह प्रयास करें:।

INSERT INTO mytable (serial_no) SELECT MAX(serial_no)+1 FROM mytable 
+0

सुरक्षित नहीं है - डुप्लिकेट के साथ समाप्त हो सकता है, यदि दो INSERT लगभग एक ही समय में दो कनेक्शन से होता है .. .. –

+0

हाँ ... यहां बदसूरत समाधान लेनदेन में सम्मिलित करना होगा ... –

+2

बदसूरत नहीं - केवल ** व्यवहार्य और सुरक्षित ** समाधान! –

संबंधित मुद्दे