2010-01-18 10 views
7

मेरे पास कई पंक्तियों वाली एक तालिका है लेकिन वे आदेश से बाहर हैं। मैं प्राथमिक आईडी के रूप में फ़ील्ड "आईडी" का उपयोग कर रहा हूं। मेरे पास "डेट" फ़ील्ड भी है जो एक डेटाटाइम फ़ील्ड है।mysql तालिका reindex कैसे करें

कैसे मैं दिनांक फ़ील्ड

+5

किसी भी संबंधित डेटाबेस में किसी विशेष क्रम में पंक्तियों को संग्रहीत * संग्रहीत * शायद एक अच्छा विचार नहीं है। यह इंडेक्स और ऑर्डर बीईएस के लिए हैं। आईडी सिर्फ पहचानकर्ता हैं; यदि महत्वपूर्ण प्रकार दिनांक/समय से है, तो कौन परवाह करता है कि आईडी क्या हैं? – Joe

उत्तर

8

तरह से मैं इसे ऑटो वेतन वृद्धि सूचकांक के साथ एक नई तालिका बनाने के लिए और सिर्फ सभी का चयन है क्या करना होगा के अनुसार तालिका पुन: अनुक्रमणिका सकता है, ताकि प्रविष्टियों कालानुक्रमिक क्रम में id'd कर रहे हैं तिथि में ऑर्डर करने में आपकी पुरानी तालिका। फिर आप अपनी पुरानी टेबल निकाल सकते हैं।

6

निम्नलिखित SQL स्निपेट को आप जो चाहते हैं वह करना चाहिए।

ALTER TABLE test_table ADD COLUMN id2 int unsigned not null; 
SET @a:=0; 
UPDATE test_table SET [email protected]:[email protected]+1 ORDER BY `date`; 
ALTER TABLE test_table DROP id; 
ALTER TABLE test_table CHANGE id2 id int UNSIGNED NOT NULL AUTO_INCREMENT, 
    ADD PRIMARY KEY (id); 

ध्यान रखें कि आप एक स्वत: वृद्धि स्तंभ के आदेश की गारंटी नहीं कर सकते हैं एक बार आप डालने और डेटा को हटाने शुरू करते हैं, तो आप जो आप में ORDER BY का उपयोग कर निर्दिष्ट करें कि को छोड़कर किसी भी क्रम पर नहीं भरोसा किया जाना चाहिए अपने प्रश्नों। यह एक महंगा ऑपरेशन है जिसे आप कर रहे हैं, क्योंकि इसे इंडेक्स को पूरी तरह से फिर से बनाया जाना आवश्यक है, इसलिए मैं इसे अक्सर करने का सुझाव नहीं दूंगा।

9

आप आईडी के अनुक्रम को तारीखों से सहसंबंध क्यों चाहते हैं? ऐसा लगता है कि आप ORDER BY id करना चाहते हैं और पंक्तियों को तारीख के क्रम में वापस आना है। यदि आप तिथि क्रम में पंक्तियां चाहते हैं, तो बस इसके बजाय ORDER BY date का उपयोग करें।

एक ऑटोइनक्रिकमेंट आईडी कॉलम में मानों को मनमाने ढंग से माना जाना चाहिए। तिथि आईडी में होने वाली आपकी आईडी पर निर्भर करना एक बुरा विचार है।

2

आप ALTER TABLE टी ऑर्डर द्वारा कॉल कर सकते हैं; ऑर्डर बीई के अनुमत वाक्यविन्यास SELECT कथन में है।

8

एक चर का उपयोग कर एक सरल प्रश्न की तरह कुछ के बारे में कैसे:

set @ROW = 0; 
UPDATE `tbl_example` SET `id` = @ROW := @ROW+1 ORDER BY `fld_date` ASC; 

इस तरह अपनी पंक्तियों को आदेश देगा: 0,1,2,4,5 ... आदि अपनी तिथि से।

+0

यह ऑटो-वृद्धि काउंटर –

+0

को रीसेट नहीं करेगा, मुझे उस पहली पंक्ति को 'सेट @ROW = 0;' पर बदलना था और फिर यह काम करता था –

0

मुझे कुछ ऐसा करना पड़ा। ऐसा करने के लिए सबसे अच्छा तरीका यह था निम्नलिखित (आपको लगता है कि यह एक धीमी और बहुत संसाधन लेने वाली आपरेशन है मन में एक एसक्यूएल क्वेरी में चला सकते हैं अगर आप चाहते हैं, लेकिन नंगे):

एक करना सुनिश्चित करें इस QUERY शुरू करने से पहले संरचना और डेटा सहित आपके टेबल का बैकअप!

ALTER TABLE your_table ADD COLUMN temp_id INT UNSIGNED NOT NULL; 
SET @a:=0; 
UPDATE your_table SET [email protected]:[email protected]+1 ORDER BY `date` ASC; 
ALTER TABLE your_table DROP id; 
ALTER TABLE your_table CHANGE temp_id id INT UNSIGNED NOT NULL AUTO_INCREMENT, ADD PRIMARY KEY (id); 
ALTER TABLE your_table CHANGE COLUMN id id INT(10) FIRST; 

बस अपने तालिका का नाम है, और स्तंभों द्वारा आदेश के साथ "your_table" बदलने के लिए मत भूलना। यहाँ मैं आप कदम से इस तरह से कदम क्या कर रहे हैं आप की व्याख्या:

  1. सबसे पहले आप "temp_id" नामक एक नया स्तंभ जोड़ने (यकीन है कि यह एक नाम आप पहले से ही उपयोग कर रहे हैं नहीं है बनाने के);
  2. अगला आप 0 (के बराबर एक temp चर या से शुरू करने के लिए जो कुछ भी चाहते हैं उसे जोड़ें);
  3. फिर आप अपनी तालिका को सेट करें, सेट ऑर्डर लॉग द्वारा पंक्ति द्वारा पंक्ति, अपने नए कॉलम "temp_id" के लिए मान सेट करके आपके द्वारा सेट किए गए चर के बराबर, फिर इस चर को 1 (द्वारा बढ़ाएं, आप कुछ फंकी कर सकते हैं यहां, उदाहरण के लिए यदि आप चाहते हैं कि आपकी आईडी हमेशा भी रहें, तो आप @ ए + 2 सेट कर सकते हैं);
  4. अगला चरण आप अपनी पुरानी कॉलम आईडी ड्रॉप (हटाएं);
  5. फिर आप अपने temp_id कॉलम का नाम वापस आईडी में बदलते हैं और यह स्वचालित वृद्धि के साथ एक सकारात्मक पूर्णांक के रूप में बदलता है जो आपकी तालिका की प्राथमिक कुंजी है।
  6. क्योंकि आईडी अब नया जोड़ा गया temp_id कॉलम है, यह आपकी तालिका संरचना के अंत में स्थित है। इसे पहले कॉलम के रूप में फिर से स्थानांतरित करने के लिए, आप यह सुनिश्चित करने के लिए अंतिम क्वेरी चलाते हैं कि यह पहला कॉलम है।
संबंधित मुद्दे