2009-03-27 15 views
6

में ऑटोइनक्रिकमेंट कॉलम अपडेट करें मुझे SQLSERVER 2005 डेटाबेस की तालिका की एक पंक्ति में एक पीके मान बदलने की आवश्यकता है। पीके वर्तमान में ऑटो-वृद्धिशील है।SQL सर्वर

एक संभावना अस्थायी रूप से कुंजी से ऑटो-वृद्धि को हटाने, संशोधन करने और इसे वापस रखने की संभावना है।

डेटाबेस उत्पादन में है। क्या डीबी को नीचे ले जाने के बिना सुरक्षित रूप से इस बदलाव को करने का कोई तरीका है?

क्यों? मेरा ग्राहक किसी एक रिकॉर्ड के लिए एक विशिष्ट आईडी चाहता है।

मुझे क्या डर है? मुझे डीबी में रिकॉर्ड रिकॉर्ड होने से डर है, जबकि मैंने कुंजी को संशोधित किया है, और यह किसी अन्य तालिका पर एक इंडेक्स को गड़बड़ कर रहा है जो फ़ील्ड को एफके के रूप में उपयोग करता है? क्या मैं पागल हूँ

+1

भूल जाते हैं कि किसी भी तालिका जो इस प्राथमिक कुंजी संदर्भ नया मान को अद्यतन करने की इससे पहले कि आप पुराने पंक्ति को हटा सकते हैं की आवश्यकता होगी है। – mrdenny

उत्तर

14

अद्यतन कर रहा है काम नहीं करता है - आप नए रिकॉर्ड सम्मिलित और पुराने वाले बजाय हटाना होगा ...

set identity_insert mytable on 

insert mytable (myidentitycolumn, someothercolumn) 
select 42, someothercolumn 
from mytable 
where myidentitycolumn = 1; 

delete mytable where myidentitycolumn = 1; 

set identity_insert mytable off 
+0

यह काम नहीं करता है = "पहचान कॉलम XXXXX अपडेट नहीं कर सकता" –

+0

मैट - आप सही हैं। उत्तर तदनुसार अद्यतन किया गया है, और आपके उत्तर में +1 भी है। –

+0

आपका अब जाने के लिए अच्छा है :) –

4

आप केवल पहचान छोड़कर इसे फिर से बनाकर अपडेट कर सकते हैं। हालांकि, आप पहचान सम्मिलन को भी सेट कर सकते हैं (http://msdn.microsoft.com/en-us/library/aa259221(SQL.80).aspx) और अपनी इच्छित पहचान वैल के साथ एक नई पंक्ति डालें, पहचान डालें बंद करें, फिर पुराना हटा दें। तुम ऐसा क्यों करना चाहते हो?

3
SET IDENTITY_INSERT yourTable ON 

INSERT INTO yourTable (col1, col2, col3) 
select newID, col2, col3 
FROM yourTable 
WHERE currentID = xxx 

SET IDENTITY_INSERT yourTable OFF 

आप तालिका लॉक करने के लिए से अन्य आवेषण को रोकने के लिए चाहते हो सकता है असफल होने पर IDENTITY_INSERT चालू है।

संपादित करें: अच्छी तरह से बकवास, मैं मूल रिकॉर्ड हटाने के बारे में स्पष्ट बिट भूल गया।

0
DECLARE @counter int 
SET @counter = 0 
UPDATE #tmp_Users 
SET @counter = counter = @counter + 1 
+0

कृपया अधिक जानकारी के साथ संपादित करें। केवल कोड और "इसे आज़माएं" उत्तर निराश हैं, क्योंकि उनमें कोई खोज योग्य सामग्री नहीं है, और यह समझाएं कि किसी को "इसे आजमाएं" क्यों चाहिए। – abarisone

+0

यह उत्तर निम्न गुणवत्ता वाली समीक्षा कतार में बदल गया है, संभवतः क्योंकि आप कोड का कोई स्पष्टीकरण प्रदान नहीं करते हैं। यदि यह कोड प्रश्न का उत्तर देता है, तो अपने उत्तर में कोड समझाते हुए कुछ पाठ जोड़ने पर विचार करें। इस तरह, आप अधिक अपवर्तित होने की अधिक संभावना रखते हैं - और प्रश्नकर्ता को कुछ नया सीखने में मदद करें। – lmo