एक MySQL तालिका में कॉलम कैसे स्थानांतरित करें?


207

वर्तमान में मेरे पास निम्न MySQL तालिका है: Employees (empID, empName, department);

मैं तालिका को निम्न में बदलना चाहता हूं: Employees (empID, department, empName);

ALTERबयानों का उपयोग करके यह कैसे किया जा सकता है ?

नोट: मैं केवल स्तंभ स्थिति बदलना चाहता हूं।


मैं पूछ सकता हूँ क्यों? स्तंभ क्रम काफी सिर्फ एक esthetic समस्या है ...
deceze

6
@ डिसेज़ शायद नहीं - यह एक SELECT *बयान में मूल्यों के क्रम को परिभाषित करता है । (दी, यदि मूल्यों का क्रम महत्वपूर्ण है, तो एक को उन्हें स्पष्ट रूप से बयान में सूचीबद्ध करना चाहिए, लेकिन शायद ओपी का यहां कुल नियंत्रण नहीं है।)
टेड हॉप

1
मुझे पता है कि यह कुछ भी प्रभावित नहीं करता है। मेरी मूल तालिका में कई कॉलम हैं इसलिए मैंने केवल 3 कॉलम जोड़े हैं जो अंतिम में जोड़े गए हैं। लेकिन मैं उन्हें पदों पर प्रदर्शित करने के लिए 3-4-5 के उपयोग को कम करना चाहते हैं SELECTबयान
सुमित

6
@iSumitG: यह भी ध्यान दें कि AFTER columnइसका इस्तेमाल भी किया जा सकता है ALTER TABLE ADD column। (अगली बार जब आप कुछ फ़ील्ड जोड़ते हैं।)
ypercube

2
यदि mysql डंप लोड कर रहा है, तो यह इन्सर्ट में इन्सर्ट करता है। इसलिए यदि आप उदाहरण के लिए, आप डेटा को देव से लोड कर रहे हैं और कॉलम क्रम से बाहर हैं, तो आपको एक त्रुटि मिलेगी। इसलिए कोई ऐसा करना चाहेगा।
हुर्रे इम

जवाबों:


345

अगर नाम एक VARCHAR (50) कॉलम है:

ALTER TABLE Employees MODIFY COLUMN empName VARCHAR(50) AFTER department;

संपादित करें

टिप्पणियों के अनुसार, आप यह भी कर सकते हैं:

ALTER TABLE Employees CHANGE COLUMN empName empName VARCHAR(50) AFTER department;

ध्यान दें कि पुनरावृत्ति empNameजानबूझकर की गई है। आपको MySQL को बताना होगा कि आप उसी कॉलम का नाम रखना चाहते हैं।

आपको पता होना चाहिए कि दोनों वाक्यविन्यास संस्करण MySQL के लिए विशिष्ट हैं। वे काम नहीं करेंगे, उदाहरण के लिए, PostgreSQL या कई अन्य DBMS में।

एक अन्य संपादन: जैसा कि @Luis रॉसी ने एक टिप्पणी में कहा है, आपको AFTERसंशोधक से ठीक पहले परिवर्तित स्तंभ परिभाषा को पूरी तरह से निर्दिष्ट करने की आवश्यकता है । उपरोक्त उदाहरण बस है VARCHAR(50), लेकिन अगर आपको अन्य विशेषताओं (जैसे कि NOT NULLया डिफ़ॉल्ट मान) की आवश्यकता है, तो आपको उन लोगों को भी शामिल करना होगा। अधिक जानकारी के लिए डॉक्स परALTER TABLE परामर्श करें ।


6
बस एक नोट: MODIFY 4 संस्करण तक समर्थित नहीं है
Erre Efe

4
आपको कॉलम नाम को दोहराने की आवश्यकता है, क्योंकि सिंटैक्स मानता है कि आप कॉलम नाम बदलना चाहते हैं। जैसे: वैकल्पिक टेबल कर्मचारियों की सूची COLNN साम्राज्यनाम varchar (50) AFTER विभाग;
brianjcohen

ध्यान रखें कि परिवर्तित आदेश डेटाबेस SQL ​​डंप में परिलक्षित नहीं होगा।
स्कले

3
@SalehEnamShohag - हाँ, डॉक्स के अनुसार , COLUMNकीवर्ड ALTER TABLEबयानों में वैकल्पिक है । मैं इसका उपयोग करना पसंद करता हूं क्योंकि मुझे लगता है कि यह कथन को अधिक पठनीय बनाता है।
टेड होप

1
मेरे लिए ठीक काम करता है, मेरे मामले में मुझे यह परिभाषित करने की आवश्यकता थी कि स्तंभ था NOT NULL DEFAULT 1, यह उदाहरण में स्तंभ प्रकार के ठीक बाद किया जाता हैVARCHAR(50)
लुइज़ रॉसी

67

कॉलम स्थिति बदलें:

ALTER TABLE Employees 
   CHANGE empName empName VARCHAR(50) NOT NULL AFTER department;

यदि आपको इसे पहले स्थान पर ले जाने की आवश्यकता है तो आपको ALTER TABLE CHANGE [COLUMN] क्वेरी के अंत में शब्द FIRST का उपयोग करना होगा:

ALTER TABLE UserOrder 
   CHANGE order_id order_id INT(11) NOT NULL FIRST;

24
यह उल्लेख करना कि इसे पहली स्थिति में कैसे स्थानांतरित किया जाए, यह काफी उपयोगी था
ट्रिस्टियन

2
किसी भी विचार कैसे यह एक बड़ी मेज पर प्रदर्शन करेंगे? क्या यह सिर्फ कुछ मेटाडेटा बदल रहा है, या क्या वास्तव में डिस्क पर डेटा को पुनर्गठित करना है?
किप

6
कोई बात नहीं, मेरे अपने सवाल का जवाब देकर मैंने इसे एक टेबल पर आज़माया, जिसमें 3.9M पंक्तियाँ थीं, इसमें लगभग 2 मिनट लगे। इसलिए यह निश्चित रूप से कुछ मेटाडेटा को स्वैप करने से अधिक कर रहा है।
किप

14

phpMyAdmin एक तालिका के संरचना दृश्य के भीतर इसके लिए एक GUI प्रदान करता है। उस कॉलम का चयन करने के लिए जाँच करें जिसे आप स्थानांतरित करना चाहते हैं और कॉलम सूची के नीचे स्थित परिवर्तन क्रिया पर क्लिक करें। फिर आप सभी कॉलम गुणों को बदल सकते हैं और आपको स्क्रीन के सबसे दाईं ओर 'मूव कॉलम' फ़ंक्शन मिलेगा।

बेशक यह सब पूरी तरह से अच्छे शीर्ष उत्तर में प्रश्नों का निर्माण कर रहा है, लेकिन जीयूआई प्रशंसक विकल्प की सराहना कर सकते हैं।

मेरा phpMyAdmin संस्करण 4.1.7 है


1
यह प्रश्न विशेष रूप से पूछता है "ALTER कथनों का उपयोग करके यह कैसे किया जा सकता है"। MySQL चलाने वाले हर कोई phpMyAdmin का उपयोग नहीं करता है।
कालेब

3
मैं बहुत कुछ सीखता हूं जो आजकल मैं एक कमांड लाइन पर phpMyAdmin जैसे GUI टूल्स से क्वेरी आउटपुट को देखने से करता हूं। मैं इस पद के लिए बहुत खुश हूं क्योंकि ppl इस आधार पर फिट दिखाई देते हैं: 1 व्यक्ति इसे देखेगा, अपना काम ऐसे माहौल में करवाएगा, जिसमें वे सहज महसूस करते हैं, थोड़ा सीखते हैं और आगे बढ़ते हैं।

इस क्रिया के लिए phpmyadmi doensn't कमांड को कार्रवाई करते हुए दिखाती है। यह नहीं मिला
Tebe

2
वाह, एक वैकल्पिक समाधान के लिए बहुत गुस्सा है जो चाल करता है और उन उत्तरों की प्रशंसा करता है जो ओपी ने एलटर SQL के लिए अनुरोध किया था।
इवेन

1

मुझे एक उत्पाद के बाद के चरणों में पेश किए गए कॉलम के लिए इसे 10+ तालिकाओं पर चलाना था। इसलिए सभी 'संबंधित' तालिकाओं के लिए परिवर्तन कमांड उत्पन्न करने के लिए इस त्वरित अयोग्य स्क्रिप्ट को लिखा।

SET @NeighboringColumn = '<YOUR COLUMN SHOULD COME AFTER THIS COLUMN>';

SELECT CONCAT("ALTER TABLE `",t.TABLE_NAME,"` CHANGE COLUMN `",COLUMN_NAME,"` 
`",COLUMN_NAME,"` ", c.DATA_TYPE, CASE WHEN c.CHARACTER_MAXIMUM_LENGTH IS NOT 
NULL THEN CONCAT("(", c.CHARACTER_MAXIMUM_LENGTH, ")") ELSE "" END ,"  AFTER 
`",@NeighboringColumn,"`;")
FROM information_schema.COLUMNS c, information_schema.TABLES t
WHERE c.TABLE_SCHEMA = '<YOUR SCHEMA NAME>'
AND c.COLUMN_NAME = '<COLUMN TO MOVE>'
AND c.TABLE_SCHEMA = t.TABLE_SCHEMA
AND c.TABLE_NAME = t.TABLE_NAME
AND t.TABLE_TYPE = 'BASE TABLE'
AND @NeighboringColumn IN (SELECT COLUMN_NAME 
    FROM information_schema.COLUMNS c2 
    WHERE c2.TABLE_NAME = t.TABLE_NAME);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.