क्या मैं एक क्वेरी में MySQL ENUM कॉलम में मानों का नाम बदल सकता हूं?


12

मान लीजिए कि मेरे पास एक डेटाबेस तालिका है ENUM('value_one','value_two')। मैं इसे एक में बदलना चाहता हूं ENUM('First value','Second value')। मैं वर्तमान में कर रहा हूँ कि इस प्रकार है:

ALTER TABLE `table` MODIFY `column` ENUM('value_one','value_two','First value','Second value');
UPDATE `table` SET `column`='First Value' WHERE `column`='value_one';
UPDATE `table` SET `column`='Second Value' WHERE `column`='value_two';
ALTER TABLE `table` MODIFY `column` ENUM('First value','Second value');

क्या ऐसा करने के लिए एक अधिक कुशल तरीका है, उदाहरण के लिए एकल ALTER TABLE कथन के साथ इसे पूरा करने का एक तरीका है ?

जवाबों:


10

Follolwing तकनीक मैं दिखाने वाला हूं कि आपको स्टील की हिम्मत की आवश्यकता होगी।

निम्नलिखित मानदंडों को देखते हुए

  • दातादिर है /var/lib/mysql
  • तालिका है mydb.mytb
  • enum कॉलम कहा जाता है enum_col
  • इंजन MyISAM है

यहाँ एक मौत को रोकने वाली दरार है:

  1. CREATE TABLE mydb.mybt LIKE mydb.mytb;

  2. ALTER TABLE mydb.mybt MODIFY enum_col ENUM('First value','Second value');

  3. SET wait_timeout=86400; SET interactive_timeout=86400;

  4. FLUSH TABLES WITH READ LOCK;

  5. एक अलग OS / SSH सत्र में, .frm फ़ाइलों को स्वैप करें

    • $ mv /var/lib/mysql/mydb/mytb.frm /var/lib/mysql/mydb/myxx.frm
    • $ mv /var/lib/mysql/mydb/mybt.frm /var/lib/mysql/mydb/mytb.frm
    • $ mv /var/lib/mysql/mydb/myxx.frm /var/lib/mysql/mydb/mybt.frm
  6. UNLOCK TABLES;

  7. DROP TABLE mydb.mybt;

बस !!!

गुफा: मैं इस के लिए नहीं ले जा सकता!

यह तकनीक "उच्च प्रदर्शन MySQL: अनुकूलन, बैकअप, प्रतिकृति, और अधिक" से आती है, पृष्ठ 146-148 के तहत सब-स्पीडिंग स्पीड के तहत वैकल्पिक तालिका । पृष्ठ 147 अनुच्छेद 1 कहता है:

हम जिस तकनीक को प्रदर्शित करने वाले हैं वह असमर्थित, अनिर्धारित है और काम नहीं कर सकती है। अपने जोखिम पर प्रयोग करें। हम आपको सलाह देंगे कि आप पहले डेटा का बैकअप लें!

कोशिश तो करो ! (कृपया हमें बताएं कि यह कैसे निकला)

UPDATE 2011-10-05 17:49 EDT

यदि तालिका MyISAM है और आपके पास उत्पादन में पर्याप्त जगह है और एक सीधी अप-डाउन विंडो है, तो यह प्रयास करें:

  1. service mysql restart --skip-networking

  2. एक अलग ओएस / एसएसएच सत्र में, तालिका की एक प्रति बनाएं

    • cp /var/lib/mysql/mydb/mytb.frm /var/lib/mysql/mydb/mytbplay.frm
    • cp /var/lib/mysql/mydb/mytb.MYD /var/lib/mysql/mydb/mytbplay.MYD
    • cp /var/lib/mysql/mydb/mytb.MYI /var/lib/mysql/mydb/mytbplay.MYI

INFORMATION_SCHEMA.TABLESस्वचालित रूप से नई तालिका की उपस्थिति का पता लगाया जाएगा mydb.mytbplay

  1. पर-स्टील-कलन विधि का प्रदर्शन करें mydb.mytbplay

  2. आप की अखंडता का परीक्षण करें mydb.mytbplay

यदि आप संतुष्ट हैं

  1. ALTER TABLE mydb.mytb RENAME mydb.mytb_backup;

  2. ALTER TABLE mydb.mytbplay RENAME mydb.mytb;

  3. service mysql restart

कोशिश तो करो!


एक सरल जवाब के लिए +1! हालाँकि, मैं इसे एक कोशिश नहीं करूँगा और आपको यह बता दूंगा कि यह कैसे निकला क्योंकि यह प्रश्न मेरे सभी ग्राहक के लाइव, प्रोडक्शन डेटाबेस के लिए एक अपग्रेड स्क्रिप्ट को संदर्भित करता है;; मजे के लिए। लेकिन उस चेतावनी के साथ मैं इसे उत्पादन में कभी नहीं चलाऊंगा!
जोश

3

एक सरल समाधान होगा:

1- एक नया कॉलम जोड़ें:

ALTER TABLE `table` ADD `enum2` ENUM('First value', 'Second value') NOT NULL AFTER `enum`;

2- प्रतिस्थापन के साथ कॉलम के मान को enum2 पर कॉपी करें:

UPDATE `table` SET enum2=REPLACE(`column`, "value_one", "new value")

3 ड्रॉप स्तंभ column, नाम बदलने enumके लिए column

नोट : यह प्रश्न 2011-10-05 तक वापस आ गया, मेरा समाधान MYSQL 4.1 और नए (AFAIK) के लिए मान्य है


हालांकि यह एक अच्छे समाधान की तरह लगता है (और स्वीकृत उत्तर के रूप में लगभग नॉन-व्रैकिंग नहीं है!), यह ध्यान देने योग्य है कि चरण 3 में कम से कम एक ALTER TABLEबयान की आवश्यकता होती है , और ओपी को कुछ की तलाश थी जो केवल एक की आवश्यकता थी। फिर, यह कहा, यह एक पूरी तरह से मानक, ठोस समाधान की तरह लगता है।
RDFozz
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.