एक

2012-04-06 20 views
5

द्वारा वृद्धि ऑटोइनक्रिएशन आईडी फ़ील्ड में मेरे पास एक MySQL 5 सर्वर है और इसमें एक आईडी फ़ील्ड (प्राथमिक कुंजी) पर एक ऑटोइनक्रिकमेंट के साथ एक तालिका है। अब मैं बीच में एक रिकॉर्ड जोड़ना चाहता हूं और इसलिए मुझे सभी अन्य आईडी को एक से बढ़ा देना है। मैंने यही कोशिश की:एक

UPDATE myTable SET id=id+1 WHERE id >= 53 

यह काम नहीं करता है क्योंकि उदाहरण के लिए आईडी = 52 के साथ एक रिकॉर्ड पहले से मौजूद है। मैं यह कैसे कर सकता हूँ? अगर वह आखिरी प्रविष्टि में शुरू होता है और अपडेट करता है तो इसे काम करना चाहिए। पर कैसे?

+3

प्राथमिक एक * पहचान प्रदान करना है * नहीं करने के लिए * आदेश * उन्हें:


अगर, हालांकि, आप तय करते हैं क्या तुम सच में इस, उपयोग करना चाहते हैं। अपना वांछित आदेश निर्दिष्ट करने के लिए एक अलग कॉलम का उपयोग करें। आपके द्वारा डालने के बाद पंक्ति के लिए प्राथमिक कुंजी को बदलना यह आपको केवल समस्याएं देगा। –

+1

क्या होगा अगर autoincreament फ़ील्ड ड्रॉप और फिर से करें? –

+2

कॉलम को छोड़ना और पुनर्निर्मित करना (या मौजूदा पंक्तियों को पुनर्निर्मित करने का प्रयास करना) काम नहीं करेगा, खासकर यदि आप आईडी को कहीं और विदेशी कुंजी के रूप में इस्तेमाल कर चुके हैं। (यह मौजूदा पंक्तियों से कनेक्शन तोड़ देगा।) आपको वास्तव में @ मार्कबर्स को सुनना चाहिए - "आपके द्वारा डालने के बाद पंक्ति के लिए प्राथमिक कुंजी को बदलना इससे आपको केवल समस्याएं मिलेंगी।" यह भी देखें [यह] (http://stackoverflow.com/questions/2106237/is-there-any-harm-in-resetting-the-auto-increment) SO प्रश्न और इसका उत्तर है। –

उत्तर

11

मैं इस के लिए कोई अच्छा कारण देखने के लिए आईडी। केवल समस्याएं झुकाव कथन चलाने से पहले, जांचें कि क्या आपके पास FOREIGN कुंजी परिभाषित हैं, जो इस id को संदर्भित करती हैं। क्या वे ON UPDATE CASCADE पर सेट हैं? साथ ही, क्या आपके पास इस तालिका से संबंधित कोई ट्रिगर्स हैं?

लेकिन पहले विचार करें, क्यों आपको (आपको लगता है) इसकी आवश्यकता है। क्या यह टेबल को ऑर्डर करने के लिए इस्तेमाल किया जा रहा है? उस स्थिति में, जैसा कि @ मार्क ने इंगित किया है, आपको वांछित क्रम निर्दिष्ट करने के लिए एक अलग कॉलम का उपयोग करना चाहिए। एक पंक्ति के लिए,

UPDATE myTable 
SET id = id + 1 
WHERE id >= 53 
ORDER BY id DESC ; 
+0

के साथ कर सकते हैं मैं इसे ऑर्डर करने के लिए उपयोग नहीं करता हूं। क्या MySQL क्वेरी ब्राउज़र के साथ विदेशी कुंजी पर जांच करने के लिए कोई त्वरित तरीका है? ट्रिगर के लिए वही ... – testing

+0

यह पता लगाने के लिए कि ** इस तालिका से अन्य तालिकाओं में FKs ** हैं, बस 'टैबलेट myTable बनाएं' का उपयोग करें। यह पता लगाने के लिए कि क्या अन्य लोगों से यह तालिका FKs ** ** है, तो आपको 'info_schema' डेटाबेस का उपयोग करना होगा। –

+1

[विदेशी कुंजी खोजने के लिए क्वेरी] (http://stackoverflow.com/questions/7765820/query-to-find-foreign-keys) –

0

मैं कुछ लगता है कि तरह काम करता है:

UPDATE myTable SET id=id+1 WHERE id >= (select id from myTable order by id DESC) 
+0

@ केन: 'ऑटो _...' नाम के बावजूद, यदि आप डिफ़ॉल्ट auto_incremented नहीं चाहते हैं तो आप एक मान असाइन कर सकते हैं। –

+0

@ypercube: Yuk। और जानकारी के लिए धन्यवाद :)। MySQL (मेरे लिए, वैसे भी) का उपयोग न करने का एक और कारण। ऊपर मेरी टिप्पणी हटाना। –

+0

AFAIK, यह SQL-Server में पहचान कॉलम पर लागू होता है। लेकिन सामान्य व्यवहार निश्चित रूप से मूल्यों को मैन्युअल रूप से दर्ज नहीं करना है। –

0

मैं एक ही समस्या का सामना करना पड़ा था। और ओपी और @ रोमेन हुग द्वारा पूछताछ के साथ भी कोशिश की। लेकिन सफल नहीं हुआ।

अंत में एक्सेल में पूरी तालिका का डेटा निर्यात किया और इसे एक्सेल में किया (एक करके एक नहीं बल्कि चाल का उपयोग करना जो इसे बहुत तेज बनाता है)।

फिर मूल तालिका का बैकअप लिया गया नई तालिका और अपडेट किए गए एक्सेल से आयातित डेटा।

+0

आपने एक्सेल में क्या किया है? फार्मूला के रूप में बस + 1? मैंने एक सीएसवी निर्यात के बारे में सोचा और फिर यहां डेटा संपादित किया। बाद में 'लोड डेटा इन्फाइल' डेटा सीएसवी के साथ "टेबल myTable में स्थानांतरित करें ... 'मैं डेटा आयात कर सकता था। आपने यह कैसे किया है? – testing

+0

ड्रैग + साइन के साथ किया गया। मैंने यूआई उपकरण के साथ डेटा आयात किया है न कि लोड डेटा के साथ। लेकिन आप इसके साथ भी कर सकते हैं। –

+0

आपने किस यूआई उपकरण का उपयोग किया था? – testing

4

त्वरित और गंदे आप इसे 2 चरणों में करते हैं।

  • वृद्धि एक संख्या अधिक है कि अन्य सभी
  • कमी संख्या के लिए सभी आईडी आप चाहते हैं

जैसा कि

UPDATE myTable SET id=id+10000 WHERE id >= 53 
UPDATE myTable SET id=id-9999 WHERE id >= 53 
संबंधित मुद्दे