ALTER TABLE स्टेटमेंट MySQL की दुनिया में सबसे अधिक इस्तेमाल किए जाने वाले स्टेटमेंट्स में से एक है - स्टेटमेंट आपको टेबल में कॉलम जोड़ने, हटाने या संशोधित करने की अनुमति देता है। इस ब्लॉग पोस्ट में हम गहराई से देखने की कोशिश करेंगे कि यह क्या है, यह क्या करता है और इसका उपयोग कब किया जाना चाहिए।
वैकल्पिक तालिका क्या है और यह क्या करती है?
जैसा कि पहले ही ऊपर बताया जा चुका है, ALTER TABLE स्टेटमेंट डीबीए और डेवलपर्स को टेबल में कॉलम जोड़ने, हटाने या संशोधित करने में सक्षम बनाता है। सीधे शब्दों में कहें तो ALTER TABLE किसी टेबल की संरचना को बदल देता है - यह आपको कॉलम जोड़ने, हटाने, इंडेक्स जोड़ने या हटाने, कॉलम का नाम बदलने या उनका प्रकार बदलने में सक्षम बनाता है।
मैं ALTER TABLE का उपयोग कब और कैसे करूँ?
ALTER TABLE का उपयोग करने के लिए आपको आमतौर पर ALTER, CREATE और INSERT विशेषाधिकारों की आवश्यकता होती है। किसी तालिका का नाम बदलने के लिए, पुरानी तालिका के लिए आवश्यक विशेषाधिकार हैं ALTER और DROP, फिर नई तालिका बनाने के लिए CREATE, ALTER और INSERT विशेषाधिकार। किसी निश्चित उपयोगकर्ता को आवश्यक विशेषाधिकार प्रदान करने के लिए, आप निम्न क्वेरी का उपयोग कर सकते हैं:
GRANT ALTER, CREATE, INSERT ON database.* TO 'demo_user';
डेटाबेस को अपने डेटाबेस नाम से बदलें, वाइल्डकार्ड को तालिका नाम से बदलें यदि आप चाहते हैं कि विशेषाधिकार केवल कुछ तालिकाओं पर लागू हों (वाइल्डकार्ड सभी तालिकाओं पर विशेषाधिकार लागू करता है) और डेमो_यूसर के नाम के साथ आपका उपयोगकर्ता। यदि आप चाहते हैं कि विशेषाधिकार सभी डेटाबेस और उनके भीतर सभी तालिकाओं में उपयोग किए जाएं, तो बस डेटाबेस को वाइल्डकार्ड से बदलें:
GRANT ALTER, CREATE, INSERT ON *.* TO 'demo_user';
वास्तव में ALTER TABLE कथन का उपयोग करने के लिए, एक क्वेरी चलाएँ जो तालिका की संरचना को बदल देती है - ALTER TABLE का उपयोग किसी तालिका में कॉलम जोड़ने, हटाने या संशोधित करने के लिए किया जाता है:क्वेरी भी कर सकती है कॉलम में इंडेक्स जोड़ने के लिए इस्तेमाल किया जा सकता है। यहां अक्सर उपयोग की जाने वाली क्वेरी के कुछ बुनियादी उदाहरण दिए गए हैं:
ALTER TABLE demo_table ADD column_name VARCHAR(255) NOT NULL DEFAULT ‘’; T
उनकी क्वेरी डेमो_टेबल तालिका में एक कॉलम कॉलम_नाम जोड़ देगी। कॉलम को तालिका में पहला कॉलम बनाने के लिए क्वेरी के अंत में FIRST जोड़ें।
ALTER TABLE demo_table ADD column_2 VARCHAR(255) NOT NULL DEFAULT ‘’ AFTER column_1; T
उनकी क्वेरी डेमो_टेबल टेबल पर कॉलम कॉलम_1 के बाद कॉलम कॉलम_2 जोड़ देगी।
ALTER TABLE demo_table ADD COLUMN column_2 INT GENERATED ALWAYS AS (column_1 + 1) STORED;
यह क्वेरी तालिका में एक जेनरेट किया गया कॉलम जोड़ देगा।
ALTER TABLE demo_table DROP COLUMN demo_column;
यह क्वेरी डेमो_टेबल टेबल पर डेमो_कॉलम कॉलम को छोड़ देगी।
ALTER TABLE demo_table ADD INDEX demo_index(demo_column);
यह क्वेरी डेमो_टेबल नामक तालिका में डेमो_कॉलम नामक कॉलम पर डेमो_इंडेक्स (नाम चुने जा सकते हैं) नामक एक इंडेक्स जोड़ देगी।
ALTER TABLE demo_table ADD INDEX (demo_column), ADD UNIQUE (demo_unique);
यह क्वेरी डेमो_कॉलम कॉलम पर एक इंडेक्स और डेमो_यूनिक कॉलम पर एक अद्वितीय इंडेक्स जोड़ेगी।
ALTER TABLE demo_table MODIFY column_name VARCHAR(255) CHARACTER SET utf8mb4;
यह क्वेरी किसी विशिष्ट कॉलम के डिफ़ॉल्ट वर्ण सेट को बदल देगी।
ALTER TABLE demo_table CONVERT TO CHARACTER SET charset_name;
यह क्वेरी टेबल के डिफ़ॉल्ट कैरेक्टर सेट और सभी कैरेक्टर (CHAR, VARCHAR और TEXT) कॉलम को बदल देगी।
ALTER TABLE demo_table PARTITION BY HASH(demo_column) PARTITIONS 8;
यह क्वेरी हैश द्वारा डेमो_कॉलम कॉलम को 8 विभाजनों में विभाजित करेगी।
ALTER TABLE demo_table TABLESPACE tablespace_1 STORAGE DISK;
यह क्वेरी डेमो_टेबल टेबल को डिस्क-आधारित स्टोरेज में बदल देगी।
यदि आप अनुक्रमणिका जोड़ रहे हैं, तो ध्यान रखें कि आप विभिन्न प्रकार के अनुक्रमणिका जोड़ सकते हैं (उदाहरण के लिए, BTREE अनुक्रमणिका या FULLTEXT अनुक्रमणिका), आप एक अनुक्रमणिका भी जोड़ सकते हैं जिसमें केवल एक निश्चित राशि शामिल हो इस तरह की क्वेरी वाले कॉलम में वर्णों की संख्या:
ALTER TABLE demo_table ADD INDEX demo_index(column_name(10));
उपरोक्त क्वेरी डेमो_टेबल नामक तालिका में कॉलम_नाम नामक कॉलम के पहले 10 वर्णों पर डेमो_इंडेक्स नामक एक इंडेक्स जोड़ देगी।
MySQL में इंडेक्स एक जटिल जानवर हैं और वे वास्तव में अपने स्वयं के एक विषय के लायक हैं, इसलिए हम यहां विवरण में नहीं जाएंगे, लेकिन यदि आप अधिक जानना चाहते हैं, तो MySQL इंडेक्स के बारे में हमारी पिछली पोस्ट को कुछ प्रदान करना चाहिए अधिक अंतर्दृष्टि।
वैकल्पिक तालिका कैसे काम करती है?
MySQL में ALTER TABLE की अपनी बारीकियां हैं। MySQL के सबसे वर्तमान संस्करण के रूप में, यानी MySQL 8.0। 3 एल्गोरिदम हैं जिनके लिए ALTER TABLE ऐसे परिवर्तनों के लिए प्रदर्शन करता है। ये हैं:
- <ली भूमिका ="प्रस्तुति">
कॉपी करें
- <ली भूमिका ="प्रस्तुति">
संचालन मूल तालिका की एक प्रति पर किया जाता है, और तालिका डेटा को मूल तालिका से नई तालिका पंक्ति में पंक्ति द्वारा कॉपी किया जाता है। ज्यादातर मामलों में, विशेष रूप से बड़ी और बड़ी तालिकाओं के लिए संसाधन उपयोग के मामले में यह एल्गोरिदम बहुत महंगा हो सकता है। जब यह एल्गोरिथम चुना या चुना जाता है, तो सभी समवर्ती डीएमएल की अनुमति नहीं है, इसलिए प्रभावित तालिका को संदर्भित करने वाले किसी भी बाद के प्रश्नों को प्रक्रिया सूची में प्रतीक्षा या कतारबद्ध करना होगा। संभावना है, यदि कनेक्शन अधिकतम हो जाते हैं तो आपका डेटाबेस अटक जाएगा।
INPLACE
- <ली भूमिका ="प्रस्तुति">
संचालन तालिका डेटा की प्रतिलिपि बनाने से बचते हैं लेकिन तालिका को जगह में पुनर्निर्माण कर सकते हैं। ऑपरेशन की तैयारी और निष्पादन चरणों के दौरान टेबल पर एक विशेष मेटाडेटा लॉक को संक्षेप में लिया जा सकता है। आमतौर पर, समवर्ती डीएमएल समर्थित है।
तत्काल
- <ली भूमिका ="प्रस्तुति">
ऑपरेशन केवल डेटा डिक्शनरी में मेटाडेटा को संशोधित करते हैं। तैयारी और निष्पादन के दौरान टेबल पर कोई विशेष मेटाडेटा लॉक नहीं लिया जाता है, और टेबल डेटा अप्रभावित रहता है, जिससे संचालन तत्काल हो जाता है। समवर्ती डीएमएल की अनुमति है। (MySQL 8.0.12 में पेश किया गया)
MySQL की ALTER TABLE प्रक्रिया छोटी तालिकाओं के साथ कोई समस्या नहीं हो सकती है, लेकिन यदि आपका डेटा सेट बड़ा है तो आप समस्याओं का सामना कर सकते हैं - कई लोगों ने ALTER TABLE प्रश्नों का अनुभव किया है जिनमें घंटों, दिन या सप्ताह भी लगे हैं। पूर्ण करना। ज्यादातर मामलों में, यह ऊपर उल्लिखित MySQL की तालिका परिवर्तन प्रक्रिया के कारण होता है। हालांकि, क्वेरी को पूरा करने में लगने वाले समय को कम से कम थोड़ा कम करने का एक तरीका है:
-
फिर इसकी संरचना को समायोजित करना। इस मामले में डेमो_टेबल सोर्स टेबल है और डेमो_टेबल_न्यू नई टेबल है।CREATE TABLE demo_table_new LIKE demo_table;
- नई तालिका में डेटा डालें।
- पुरानी तालिका का नाम बदलकर demo_table_old कर दें (अपनी आवश्यकताओं के अनुसार नाम समायोजित करें)।
- नई तालिका का नाम बदलकर पुरानी तालिका के पुराने नाम से कर दें।
- आखिरकार, पुरानी तालिका से पंक्तियों को नई तालिका में कॉपी करें और यदि आवश्यक हो, तो अनुक्रमणिका बनाएं।
हालांकि ऊपर दिए गए कदम ठीक काम करते हैं। फिर भी, वास्तविक दुनिया के परिदृश्यों में, डीबीए या डेवलपर्स पेरकोना के पीटी-ऑनलाइन-स्कीमा-परिवर्तन का उपयोग करने या जीथब के जीएच-ओस्ट का उपयोग करने के लिए झुकते हैं। आप हमारी पिछली पोस्ट MySQL और MariaDB माइग्रेशन के लिए टॉप ओपन सोर्स टूल्स पर एक नज़र डाल सकते हैं जो इन स्कीमा-चेंज टूल का अवलोकन करता है।
वैसे भी, जो हमने ऊपर वर्णित किया है उसे अक्सर "छाया प्रतिलिपि" दृष्टिकोण के रूप में जाना जाता है:संक्षेप में, आप वांछित संरचना के साथ एक नई तालिका बनाते हैं, फिर एक नाम बदलें और दो तालिकाओं को स्वैप करने के लिए छोड़ दें . एक और तरीका भी है:आप सर्वरों को स्वैप कर सकते हैं और उन सर्वरों पर वैकल्पिक तालिका चला सकते हैं जो उत्पादन में नहीं हैं। MyISAM के लिए, आप कुंजियाँ अक्षम कर सकते हैं, डेटा लोड कर सकते हैं, फिर कुंजियाँ सक्षम कर सकते हैं।
टेबल में बदलाव करें
यदि आप इंडेक्स बनाने के लिए ALTER TABLE स्टेटमेंट का उपयोग कर रहे हैं (आप CREATE INDEX स्टेटमेंट का भी उपयोग कर सकते हैं), तो डेटा डालने के बाद इंडेक्स बनाने की सलाह दी जाती है क्योंकि यह गति बढ़ाने का एक बहुत प्रसिद्ध तरीका है न केवल MySQL में, बल्कि Oracle जैसे अन्य डेटाबेस प्रबंधन प्रणालियों में भी प्रसंस्करण। हालांकि सामान्य तौर पर, ध्यान रखें कि अधिकांश ALTER TABLE संचालनों से MySQL में कुछ समस्याएँ (सेवा में रुकावट) उत्पन्न होने की उम्मीद की जानी चाहिए।
पूरी प्रक्रिया को गति देने का एक और तरीका भी है, हालांकि यह थोड़ा और अधिक उन्नत है:यदि आप MySQL को केवल तालिका की .frm फ़ाइल को संशोधित करने के लिए मना सकते हैं (.frm फ़ाइलें इसकी परिभाषा का वर्णन करती हैं तालिका) और तालिका को अकेला छोड़ दें, प्रक्रिया तेज हो जाएगी:
- एक खाली तालिका बनाएं जिसमें पुरानी तालिका को संशोधित किए बिना उसी लेआउट के साथ बनाया गया हो।
- उपयोग में सभी तालिकाओं को बंद करें और सभी नई तालिकाओं को खोलने से रोकें
FLUSH TABLES WITH READ LOCK.
- .frm फाइलों को स्वैप करें।
- अनलॉक टेबल्स चलाकर रीड लॉक को रिलीज करें।
यह भी ध्यान रखें कि यदि आप किसी कॉलम को संशोधित करना चाहते हैं और सिंटैक्स सही लगता है लेकिन फिर भी आपको कोई त्रुटि मिलती है, तो यह एक अलग सिंटैक्स पर गौर करने का समय हो सकता है। उदाहरण के लिए:
ALTER TABLE demo_table ADD long VARCHAR(255);
इस तरह की एक क्वेरी त्रुटिपूर्ण होगी क्योंकि लंबा एक आरक्षित शब्द है। ऐसी त्रुटि से बचने के लिए, बैकटिक्स वाले शब्द से बचें:
ALTER TABLE demo_table ADD `long` VARCHAR(255);
यह भी ध्यान देने योग्य है कि कॉलम नाम केवल बैकटिक्स का उपयोग करके बच सकते हैं, सिंगल कोट्स या डबल कोट्स के साथ नहीं। उदाहरण के लिए, इस तरह की क्वेरी भी त्रुटिपूर्ण होगी:
ALTER TABLE demo_table CHANGE COLUMN ‘demo_column’ ‘demo_column_2’ VARCHAR(255);
सारांश
MySQL तालिका में कॉलम जोड़ने, हटाने या संशोधित करने के लिए ALTER TABLE स्टेटमेंट का उपयोग करता है। कथन को सफलतापूर्वक निष्पादित करने के लिए, आपके पास तालिका के लिए ALTER,CREATE और INSERT विशेषाधिकार होने चाहिए। कथन में कुछ सूक्ष्मताएँ भी हैं जो अपने आप में अद्वितीय हैं:इसके कार्य करने के तरीके के कारण बहुत बड़ी तालिकाओं पर चलने पर इसका प्रदर्शन प्रभावित हो सकता है, लेकिन जब तक आप जानते हैं कि कथन कैसे काम करता है और यह क्या करता है, आपको ठीक होना चाहिए।पी>