क्या ENUM () सूचियों को बदलना संभव है?


19

मुझे यकीन नहीं था कि अगर ENUM () सूची को बदलना संभव नहीं है, तो मैंने एक परीक्षण किया। MySQL v5.1.58 में मैंने एक परीक्षण InnoDB तालिका बनाई जिसमें एक फ़ील्ड शामिल है जिसका नाम ENUM ('हां', 'नहीं') प्रकार का 'बूल' है।

फिर मैंने अंजाम दिया ...

ALTER TABLE  `test`
CHANGE  `bool`  `bool` ENUM(  'yes',  'no',  'maybe' )
CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL

... और यह काम कर गया।

हमसे क्या गलती हो गयी? क्या यह db इंजन पर निर्भर है?
हर कोई कहता है कि ENUM () सूची बदलना संभव नहीं है? जैसे। यहाँ http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/


3
आपके द्वारा उल्लिखित लेख यह नहीं कहता कि यह असंभव है; यह कहता है कि सदस्य सूची बदलना महंगा है क्योंकि इंजन पूर्ण तालिका स्कैन करता है।
a1ex07

मैंने अक्टूबर में ENUMs ( dba.stackexchange.com/a/6966/877 ) के बारे में आपके लिंक का उल्लेख किया । इसके अतिरिक्त, मैंने MyISAM ( dba.stackexchange.com/a/6548/874 ) में ऐसा करने का संदर्भ पोस्ट किया । इस उदाहरण में InnoDB प्रश्न से बाहर है।
रोलैंडम्यूसीडीडीबीए

जवाबों:


14

जब तक टेबल खाली है, तब तक कोई समस्या नहीं है। जब तक ENUM के लिए नए मानों को जोड़ दिया जाता है और एक आबादी वाली तालिका का नाम नहीं दिया जाता है, तब तक कोई समस्या नहीं होती है।

आपके प्रश्न में पुनर्निर्धारित ENUM ने वास्तव में हां और नहीं के लिए मूल आंतरिक मूल्यों को बनाए रखा क्योंकि परीक्षण तालिका ने इसे याद किया था।

निम्नलिखित आबादी वाले तालिकाओं पर लागू होता है:

इस बारे में क्या?

ALTER TABLE  `test`
CHANGE  `bool`  `bool` ENUM(  'no',  'yes',  'maybe' )
CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL

अब आपको एक समस्या है। पूरी तरह से आबादी वाली तालिका में ENUM मान उनके आंतरिक मानों को उलट देंगे ताकि हां अब नहीं है और अब हां नहीं है।

इस बारे में क्या?

ALTER TABLE  `test`
CHANGE  `bool`  `bool` ENUM(  'maybe', 'no',  'yes' )
CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL

बड़ी समस्या। एक आबादी वाली मेज में, हाँ अब शायद है। हां के साथ डाली गई नई पंक्तियों को पिछली हां की पंक्तियों से काट दिया गया है क्योंकि उनका मतलब अब शायद है।

सारांश

MyISAM में यह बहुत जल्दी करने के लिए बहुत उच्च-जोखिम, चारा और स्विच तकनीकें हैं । मैं ibdata1 के साथ अपने टेबलस्पेस आईडी इंटरैक्शन के कारण इनोबीडी में ऐसा करने के खिलाफ दृढ़ता से सलाह दूंगा।


इसलिए आंतरिक रूप से उन्हें ENUM () में आदेश के आधार पर इंट के रूप में संग्रहीत किया जाता है। उदाहरण के लिए ENUM ('हां', 'नहीं', 'हो सकता है') आंतरिक रूप से 'हां' के लिए 0, 'नहीं' के लिए 1, 'शायद' के लिए 2 संग्रहीत करता है। मुझे लगता है कि तालिका का मेटाडेटा ENUM ('हां' = 0, 'नहीं' => 1, 'शायद' => 2) के बजाय ENUM ('हां', 'नहीं', 'शायद') जैसा है। क्या यह सच है?
एलेक्सी गाबी

ENUM तार ​​नहीं हैं पूर्णांक: dev.mysql.com/doc/refman/5.0/en/enum.html
RolandoMySQLDBA

मैं मानता हूं कि एनईएम स्ट्रिंग्स हैं लेकिन आंतरिक रूप से वे हैं और न ही स्ट्रिंग्स के रूप में संग्रहीत हैं?
एलेक्सी गाबी

1
आप इसमें सही हैं। मेरे द्वारा दिए गए लिंक में, मेटाडेटा के रूप में पूर्णांक के लिए स्ट्रिंग का मानचित्रण है। इस वाक्यांश के लिए देखें: For example, a column specified as ENUM('one', 'two', 'three') can have any of the values shown here. The index of each value is also shown.और मूल्य / सूचकांक नक्शा अवधारणा है। इस प्रकार, आंतरिक सूचकांक संख्या से संबंधित तालिका में एक ENUM मान होगा। स्ट्रिंग्स को फिर से व्यवस्थित करने से मेटाडाटा इंडेक्सिंग को पुनर्व्यवस्थित किया जाएगा। जब एक ENUM को पुनर्परिभाषित किया जाता है तो यह आबादी वाली तालिका के लिए अच्छी तरह से नहीं झुकता है।
रोलैंडमाइसीडीडीबीए

2
कम से कम MariaDB / InnoDB के लिए, मैं बता सकता हूं कि यह मान्य नहीं है। ईएनयूएम के बीच में बदलाव, जब तक मूल्यों को हटाने / परिवर्तित होने के साथ कोई रिकॉर्ड नहीं है, तब तक अन्य मान वैसे ही बने रहने चाहिए। एकमात्र लाभ यह है कि इसे तालिका का पुनर्निर्माण करना होगा।
नूनो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.