2010-02-18 4 views
11

मुझे एक MySQL तालिका में 'id' नामक एक कॉलम मिला है जो एक प्राथमिक कुंजी भी है जो स्वत: वृद्धि करता है।mysql में हटाए गए प्राथमिक कुंजी का पुन: उपयोग कैसे करें?

जब मैं पंक्तियों को हटाता हूं तो उनकी आईडी की इच्छा भी हटा दी जाएगी, इस प्रकार मेरे आईडी अनुक्रम में "छेद" बनाते हैं।

1, 2, 3, 9, 10, 30 और इतने

वहाँ पुन: उपयोग इन हटाए गए आईडी का एक तरीका है पर: रों?

+0

आप ऐसा क्यों करना चाहते हैं? –

+0

क्योंकि मैं पंक्तियों (लिंक) के नाम के रूप में 'आईडी' का उपयोग करता हूं। तो मैं इन नामों को नहीं चाहता हूं उदाहरण के लिए 5 से 23 तक कूदने के लिए एक बड़ा छेद छोड़ना। – ajsie

+4

इसके लिए अपनी पहचान का उपयोग न करें। डिस्प्ले के दौरान अपनी पंक्तियों का नाम दें, इस तरह आप दृश्य डेटाबेस संख्या को आंतरिक डेटाबेस कुंजी से अलग करते हैं। – Joe

उत्तर

10

का उपयोग करना:

ALTER TABLE [your table name here] AUTO_INCREMENT = 1 

... auto_increment मान रीसेट जाएगा उच्चतम मौजूदा तालिका में मौजूदा मूल्य के आधार पर अगले किया जाना है। इसका मतलब है कि इसका इस्तेमाल एक से अधिक के अंतराल को सही करने के लिए नहीं किया जा सकता है।

ऐसा करने का एकमात्र कारण कॉस्मेटिक लोगों के लिए होगा - डेटाबेस की परवाह नहीं है अगर रिकॉर्ड अनुक्रमिक हैं, केवल वे एक-दूसरे से लगातार संबंधित हैं। डेटाबेस के लिए मानों को "सही" करने की कोई आवश्यकता नहीं है।

यदि आप उपयोगकर्ता को id मान प्रदर्शित कर रहे हैं, तो यही कारण है कि आप उन्हें हमेशा अनुक्रमिक होना चाहते हैं, तो मैं एक सरोगेट कुंजी जोड़ने की अनुशंसा करता हूं। उपयोगकर्ता को प्रदर्शित करने के लिए सरोगेट कुंजी का उपयोग करें, इसलिए मूल्यों को आवश्यकतानुसार फिर से अनुक्रमित किया जा सकता है लेकिन संदर्भ संबंधी अखंडता अन्यथा अप्रभावित है। इस मामले में सरोगेट कुंजी एक पूर्णांक स्तंभ होगा।

+0

यह एक परीक्षण वातावरण में भी उपयोगी हो सकता है। – Michael

1

आपके पास दो विकल्प:

  1. मैन्युअल आईडी का उल्लेख (यह स्वत: वेतन वृद्धि से ऑटो चला जाता है)
  2. TRUNCATE तालिका - इस तालिका में सभी रिकॉर्ड को नष्ट करेगा

पंक्तियों को हटाकर बनाए गए "छेद" का पुन: उपयोग करना हमेशा एक बुरा विचार है, इसका उत्तर यहां एसओ पर पहले दिया गया है लेकिन मैं अभी भी बहुत नींद आ रहा हूं और यह प्रश्न ढूंढने के लिए हूं।

+0

मैं मैन्युअल रूप से निम्नतम आईडी कैसे निर्दिष्ट कर सकता हूं? क्या आप मुझे इसके लिए PHP कोड दिखा सकते हैं? – ajsie

+0

@noname: जैसा कि मैंने अपने जवाब में कहा था, आपको ऐसा नहीं करना चाहिए, "छेद" जैसा कि आप डेटा (संबंध) अखंडता सुनिश्चित करने के लिए मौजूद हैं, यदि आप अपनी तालिका में अंतराल नहीं चाहते हैं तो आप बेहतर होंगे जब आप वास्तव में 'DELETE' SQL कथन जारी करने के बजाए एक रिकॉर्ड हटाना चाहते हैं तो अपनी तालिका में 'हटाए गए' ध्वज कॉलम को सेट करना। –

+0

मैं आईडी को एक लिंक नाम के रूप में उपयोग करता हूं .. इसलिए मैं चाहता हूं कि यह संख्याओं के बीच बड़ा कूद न हो .. मुझे लगता है कि बीमार मैन्युअल रूप से आईडी निर्दिष्ट करते हैं। – ajsie

1

आप 'वैकल्पिक तालिका t2 AUTO_INCREMENT = 1;' आज़मा सकते हैं

+0

मेरे लिए MySQL 4.1 पर काम किया, लेकिन इसके उत्तर के बारे में मेरा उत्तर देखें जो इच्छित उपयोग में फिट नहीं हो सकता है। –

2

उनका नाम बदल करने के लिए एक पार्टी स्क्रिप्ट का उपयोग करें (यदि आप एक बड़ी डेटाबेस है यह अविश्वसनीय रूप से धीमी गति से और अक्षम है) इसके बाद के बाद आप, इसे पूरा कर लें के रूप में पहले कहा ALTER तालिका का उपयोग अगले कुंजी पुनर्स्थापित करने के लिए प्रयोग की जाने वाली

TARGET=1 
for KEYS in `mysql --skip-column-names -u root --password=Password -D lookup -e "select id from tbl"` ; do 
    mysql --skip-column-names -u root --password=Password -D lookup -e "update tbl set id='$TARGET' where id = '$KEYS'" 
    TARGET=`expr $TARGET + 1` 
    echo $TARGET 
done 
संबंधित मुद्दे