2012-09-26 25 views
7

से enum मानों को हटा रहा है मेरे पास action नामक एनम कॉलम वाला एक टेबल है। वर्तमान में अनुमत मान हैं: act1,act2,act3,act4। मुझे act3 और act4 हटाया जाना चाहिए और मेरी तालिका की वर्तमान स्थिति में act3 या act4 के साथ कोई पंक्ति नहीं है।mysql कॉलम

जब मैं मानों के नए सेट के साथ कॉलम को संशोधित करने का प्रयास कर रहा हूं तो यह Data Truncated for column action त्रुटि को फेंक रहा है।

कृपया सुझाव दें कि मैं आवश्यक मानों को कैसे हटाऊं।

+0

शायद एनम का उपयोग न करें? http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/ – fancyPants

+0

अपनी रचना तालिका और वैकल्पिक तालिका विवरण दिखाएं। –

उत्तर

9

enum मान जोड़ने के लिए ALTER TABLE का उपयोग करना ठीक है और MySQL documentation में वर्णित है।

हालांकि, enum मानों को हटाने के लिए बेहतर विकल्प परिवर्तन करने के लिए एक नया कॉलम बनाना है।

ALTER TABLE your_table ADD new_action_column ENUM('act1', 'act2') ... ; 
UPDATE your_table SET new_action_column = action; 
ALTER TABLE your_table DROP action; 
ALTER TABLE your_table CHANGE new_action_column action ENUM('act1', 'act2') ... ; 

संपादित

वैसे। ENUM का उपयोग करना सबसे अच्छा विचार नहीं है, आपको इसके बजाय INT का उपयोग करना चाहिए।

8 Reasons Why MySQL's ENUM Data Type Is Evil

मैं सुझाव है कि आप की तरह

+------+-----+ 
| ENUM | INT | 
+======+=====+ 
| act1 | 0 | 
+------+-----+ 
| act2 | 1 | 
+------+-----+ 
+0

"आपको इसके बजाय आईएनटी का उपयोग करना चाहिए।" - क्यूं कर? – Barmar

+0

@ बाड़ार [8 कारण क्यों MySQL का ENUM डेटा प्रकार बुरा है] (http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/) टॉम्बॉम ने पहले ही इसका उल्लेख किया है। मैं आपके एनम वैल्यू 'एक्ट 1' और 'एक्ट 2' और इंट वैल्यू 0, 1. –

+0

@ फ्लोरियनपेरेन के बीच मैपिंग का उपयोग करने का सुझाव देता हूं। मुझे आश्चर्य है कि मौजूदा कॉलम को बदलने के बजाय कोई अस्थायी क्यों नहीं होना चाहिए बल्कि एक अस्थायी जोड़ना चाहिए। क्या आप अपना बयान दे सकते हैं? धन्यवाद! –

2

पहले एक मानचित्रण का उपयोग करने के एक प्रश्न चलाते हैं।

UPDATE table_name SET action = '' WHERE action IN ('act3', 'act4'); 

इस क्वेरी को चलाने के बाद।

ALTER TABLE table_name CHANGE action action ENUM('act1', 'act2'); 

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

+0

उन्होंने कहा कि उन मूल्यों के साथ कोई पंक्ति नहीं है जिन्हें वह निकालना है। – Barmar

+0

मुझे उपरोक्त चरणों को बनाने की आवश्यकता नहीं है क्योंकि मेरी तालिका में 'act3' और 'act4' वाली पंक्तियां नहीं हैं। त्रुटि अभी भी है। – mickeymoon

0

अन्य दो उत्तरों पहले से ही बड़े विवरण में प्रश्न को कवर कर चुके हैं, लेकिन यहां एक साधारण मुद्दा है कि आप केवल वैकल्पिक तालिका नहीं कर पाएंगे। यदि आपके पास ENUM ('BAR', 'FOO', 'REMOVEME') है और यह डेटा को कुछ हिस्सों के साथ कुछ कहने में त्रुटि देता है, तो आपके पास पहले से ही उस एनम सदस्य को एक प्रविष्टि सेट हो सकता है जिसे आप निकालना चाहते हैं। तो अगर आप पहले की तरह

अद्यतन yourtable सेट enumrow = 'FOO' कहां yourenumrow = 'REMOVEME' कुछ करने के लिए आवश्यकता होगी;

इस तरह, सभी प्रविष्टियों था कि REMOVEME अब FOO हो जाएगा और तालिका

ALTER तालिका yourtable बदलें का उपयोग कर बदला जा सकता है yourenumrow yourenumrow Enum ('FOO', 'बार') डिफ़ॉल्ट शून्य;