2009-12-05 18 views
5

मैं निम्नलिखित की तरह एक मेज है,MySQL: कैसे "को पुन: व्यवस्थित करने के लिए" एक मेज

| id | name | color | 
------+--------+--------- 
| 1 | pear | green | 
| 2 | apple | red | 
| 3 | banana | yellow | 
| 4 | grape | purple | 

मैं "नाम" कॉलम का उपयोग वर्णानुक्रम को पुन: व्यवस्थित और इस नए के साथ आईडी (autoincrement) रीसेट करना चाहते हैं कैसे मैं MYSQL के साथ ऐसा कर सकते हैं: निम्नलिखित

| id | name | color | 
------+--------+--------- 
| 1 | apple | red | 
| 2 | banana | yellow | 
| 3 | grape | purple | 
| 4 | pear | green | 

प्रश्न साथ अंत करने के लिए?

+3

आप नाम आदेश से मेल खाने के लिए आईडी ऑर्डर क्यों चाहते हैं? –

उत्तर

9

क्या मैं पूछ सकता हूं कि आप ऐसा क्यों करना चाहते हैं?

यदि कोई भी नाम मूल्यों में संशोधन करता है या नई पंक्तियों को सम्मिलित करता है तो यह आपकी ऑर्डरिंग योजना को गड़बड़ कर देगा। पीके के क्रम में कुछ अर्थ संग्रहीत करने की कोशिश कर रहा है जो तालिका में पहले से कहीं भी उपलब्ध है (नाम कॉलम) अनावश्यक लगता है और इसके परिणामस्वरूप एक बुरा विचार है।

आईडी कॉलम के मूल्य के बारे में चिंता करने के लिए एक बेहतर समाधान नहीं है और जब आप अपने ऐप में डेटा का उपयोग करते हैं तो नाम कॉलम पर सॉर्ट करें।

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

+1

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

+0

एकमात्र समय मैं सॉर्टिंग के लिए एक अतिरिक्त कॉलम जोड़ने का सुझाव दूंगा, जब तालिका में अन्य कॉलम द्वारा सॉर्ट निर्धारित नहीं किया जा सकता है। उदाहरण के लिए, यदि एप्लिकेशन ने उपयोगकर्ताओं को मनमाने ढंग से वस्तुओं को फिर से ऑर्डर करने की अनुमति दी है। – JohnFx

+1

रिकॉर्ड एक सेट बनाते हैं। सेट को एक विशिष्ट क्रम में आदेश नहीं दिया जाना चाहिए। याद रखें कि एक संबंधपरक डेटाबेस सिद्धांत शुद्ध गणितीय विचारों पर आधारित है। यदि आप अपने आवेदन में एक विशिष्ट आदेश चाहते हैं, तो ऑर्डरबी क्लॉज जोड़ें, अन्यथा निष्पादन योजना तय करेगी कि डेटा को कैसे पुनर्प्राप्त किया जाए, और इसलिए ऑर्डर; ये योजनाएं समय के साथ बदल सकती हैं। इसके अलावा, याद रखें कि सरोगेट कुंजी एंडुसर के लिए व्यर्थ हैं। – lmsasu

2

आपकी क्वेरी के अंत में "ASCER नाम ASC" क्यों नहीं जोड़ रहा है? मेरा अनुमान होगा कि आपको किसी कारण से आईडी की आवश्यकता है।

7

आप पुरानी तालिका से एक नई तालिका SELECT INTO कर सकते हैं, वांछित के रूप में अपने चयन का आदेश दे। नई तालिका में एक ऑटो-वृद्धि आईडी है। यदि आवश्यक हो, तो पुरानी तालिका छोड़ दें और नई तालिका का नाम बदलें।

-1
SELECT 
     RANK() Over (ORDER BY Name) As NewID 
    , Name 
    , Color 

FROM Fruits 

तो एक अस्थायी मेज पर बचा सकता है तो काटना फल मेज और डालने काटना, लेकिन यह शायद एक भद्दा समाधान है।

+0

MySQL विंडो किए गए कार्यों का समर्थन नहीं करता है। –

13

ऑटो वृद्धि को रीसेट करने का सबसे साफ तरीका एक और तालिका बनाना है।

MySQL CREATE TABLE LIKE और RENAME TABLE जैसे आदेश प्रदान करता है जो उपयोगी हैं।

CREATE TABLE table2 LIKE table1; 

INSERT INTO table2 
    SELECT * FROM table1 ORDER BY name; 

DROP TABLE table1; 

RENAME TABLE table2 TO table1; 
+0

यह गलत है। आप सभी (चयन करें * तालिका 1 से) का चयन नहीं कर सकते हैं, क्योंकि यदि आप ऐसा करते हैं, तो आप पीके को उसी जानकारी के साथ कॉपी करेंगे जो पंक्ति जानकारी के साथ है। जो आपको एक ही आईडी से जुड़े समान नाम और रंग वाले सटीक तालिका के साथ छोड़ देगा, लेकिन एक अलग क्रम के साथ। – MJoraid

+0

एक सुधार, तालिका 1 से सम्मिलित करने से पहले आपको तालिका 2 से पीके ड्रॉप करना होगा; तो चयन न करें *, फिर भी आईडी को छोड़कर सभी कॉलम का चयन करें। और यह आकर्षण की तरह काम करेगा – Zalaboza

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