मैं MySQL में एक सूचकांक का नाम कैसे बदलूं


83

मैं एक सूचकांक का नाम बदलना चाहूंगा। मैंने टेबल डॉक्युमेंटेशन को देखा है , लेकिन मैं सिनेमैक्स को केवल एक इंडेक्स का नाम बदलने का पता नहीं लगा सकता। MySQL GUI के माध्यम से करते समय, यह इंडेक्स को गिरा देता है, और एक नया बनाता है। जब यह काम करता है, तो मैं पूरे सूचकांक को फिर से बनाने से बचना चाहूंगा।

[अतिरिक्त जानकारी]

परिवर्तन तालिका प्रलेखन में यह बताता है

केवल तालिका मेटाडेटा और तालिका डेटा को संशोधित करने वाली परिवर्तन तालिका की .frm फ़ाइल को बदलकर और आवरण सामग्री को न करके तुरंत बनाया जा सकता है। निम्नलिखित परिवर्तन तेजी से परिवर्तन हैं जिन्हें इस तरह से किया जा सकता है:

* Renaming a column or index.

हालाँकि, जब मैंने .frm फ़ाइल (परीक्षण डेटाबेस पर) को संपादित करके और सर्वर को पुनः आरंभ करके सूचकांक का नाम बदलने की कोशिश की थी, तो अब यह कहा गया है कि कॉलम की सूची बनाने की कोशिश करते समय यूआई में "कॉलम नहीं ला सकते हैं", और चलाने की कोशिश करते समय एक क्वेरी, यह "अज्ञात टेबल इंजन ''" त्रुटि देता है। .Frm फ़ाइल में बहुत अधिक बाइनरी सामग्री होती है। क्या द्विआधारी जानकारी को संपादित करने के लिए एक अच्छा उपकरण है।

जवाबों:


144

मैंने 2009 में इस सवाल का जवाब दिया। उस समय एक सूचकांक का नाम बदलने के लिए MySQL में कोई सिंटैक्स नहीं था।

तब से, MySQL 5.7 ने एक ALTER TABLE RENAME INDEXसिंटैक्स पेश किया ।

http://dev.mysql.com/doc/refman/5.7/en/alter-table.html भाग में कहते हैं:

  • RENAME INDEX old_index_name TO new_index_nameएक सूचकांक का नाम बदल देता है। यह मानक SQL के लिए एक MySQL एक्सटेंशन है। तालिका की सामग्री अपरिवर्तित बनी हुई है। old_index_nameतालिका में मौजूदा सूचकांक का नाम होना चाहिए जो एक ही ALTER TABLEविवरण द्वारा नहीं गिराया गया है । new_index_nameनया सूचकांक नाम है, जो परिवर्तन लागू होने के बाद परिणामी तालिका में एक सूचकांक के नाम की नकल नहीं कर सकता है। न ही सूचकांक का नाम हो सकता है PRIMARY

MySQL के पहले के संस्करण, उदाहरण के लिए 5.6 और पहले के, में कोई सिंटैक्स का समर्थन नहीं करता है ALTER TABLE अनुक्रमणिका (या कुंजी, जो एक समानार्थी शब्द है) का नाम बदलने के लिए ।

एकमात्र समाधान था ALTER TABLE DROP KEY oldkeyname, ADD KEY newkeyname (...)

ALTER INDEXMySQL में कोई कमांड नहीं है । आप केवल DROP INDEXऔर फिर CREATE INDEXनए नाम के साथ कर सकते हैं ।


उपरोक्त आपके अपडेट के बारे में: शायद प्रलेखन पर्याप्त सटीक नहीं है। भले ही, सूचकांक का नाम बदलने के लिए कोई SQL सिंटैक्स नहीं है।

एक सूचकांक एक डेटा संरचना है जिसे डेटा से पुनर्निर्माण किया जा सकता है (वास्तव में यह समय-समय पर अनुक्रमित को फिर से बनाने के लिए अनुशंसित है OPTIMIZE TABLE)। इसमें कुछ समय लगता है, लेकिन यह एक सामान्य ऑपरेशन है। इंडेक्स डेटा संरचनाओं को टेबल डेटा से अलग किया जाता है, इसलिए इंडेक्स को जोड़ने या छोड़ने पर टेबल डेटा को छूने की आवश्यकता नहीं होनी चाहिए, जैसा कि दस्तावेज कहते हैं।

.frmफ़ाइल के बारे में , MySQL .frmफ़ाइल को संपादित करने का समर्थन नहीं करता है । मैं इसे किसी भी कारण से नहीं करूंगा। आपको अपनी तालिका को दूषित करने और इसे अनुपयोगी बनाने की गारंटी 100% है।



22
सामान्य ज्ञान: SQL मानक इंडेक्सों के बारे में कुछ भी नहीं कहता है! यह शुद्ध रूप से अनुकूलन से संबंधित एक वेंडर कार्यान्वयन मुद्दा है, इसलिए SQL डेटाबेस के सभी ब्रांडों में अनुक्रमित से संबंधित सभी सिंटैक्स मालिकाना है।
बिल करविन

1
हाँ, यह बहुत ज्यादा हुआ है। यहां तक ​​कि फ़ाइल को गलत तरीके से संपादित करने पर MySQL क्रैश हो गया। इसे सही रूप में चिह्नित करना। आदर्श रूप से आप सिर्फ सूचकांक का नाम बदल सकते हैं, क्योंकि यह सिर्फ मेटाडेटा है, लेकिन ऐसा लगता है कि कार्यात्मक रूप से मौजूद नहीं है।
किब्बी

61

MySQL 5.7 के लिए:

ALTER TABLE tbl_name RENAME INDEX old_index_name TO new_index_name

MySQL पुराने संस्करणों के लिए:

ALTER TABLE tbl_name DROP INDEX old_index_name, ADD INDEX new_index_name (...)

Http://dev.mysql.com/doc/refman/5.7/en/alter-table.html देखें


10
नए सूचकांक को छोड़ने और जोड़ने में सावधानी बरतें, अगर यह एक बड़ी तालिका है तो इसमें लंबा समय लग सकता है। एक बड़ी मेज पर करने का एक शानदार तरीका यह है कि pt-online-schema-change का उपयोग करें: percona.com/doc/percona-toolkit/2.1/……
jbrahy

3

यह सवाल उम्र से पहले पूछा गया था, और आखिरी बार आधे साल पहले अपडेट किया गया था। फिर भी मुझे यह टिप जोड़ने की आवश्यकता महसूस होती है:

यदि अनुक्रमित स्तंभ का उपयोग विदेशी कुंजी के रूप में कहीं और किया जाता है, तो आप उससे संबंधित त्रुटि का सामना कर सकते हैं। ऐसा करने से मदद मिल सकती है:

SET FOREIGN_KEY_CHECKS = 0;
ALTER TABLE tbl DROP INDEX index_name;
ALTER TABLE tbl ADD INDEX new_index_name (indexed_column);
SET FOREIGN_KEY_CHECKS = 1;

आशा है कि किसी को यह उपयोगी लगता है।


5
यह सीम खराब है, क्या आप ड्रॉप और ऐड पर सिर्फ ऑर्डर स्विच नहीं कर सकते? और जाँच को सक्रिय रखें? ALTER TABLE tbl ADD INDEX new_index_name (indexed_column), DROP INDEX index_name
पुगगन से

संभवत: इसे अपना जवाब पुगगन से बनाना चाहिए, क्योंकि यह 5.7 से पहले mysql के लिए सबसे कुशल / सबसे सुरक्षित तरीका है
xref

उलझन में है कि एफके एक सूचकांक से कैसे प्रभावित होगा। आप डेटा को नहीं बदल रहे हैं, केवल डेटा पर सूचकांक।
gdbj

@gdbj विदेशी प्रमुख बाधाएं एक सूचकांक पर निर्भर करती हैं, इसलिए मुझे नहीं लगता कि आप एक ऐसे सूचकांक को छोड़ सकते हैं जो एक विदेशी कुंजी बाधा द्वारा उपयोग किया जाता है।
चार्ल्स वुड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.