ENUM () তালিকা পরিবর্তন করা কি সম্ভব?


19

আমি নিশ্চিত না যে ENUM () তালিকা পরিবর্তন করা সম্ভব নয় তাই আমি একটি পরীক্ষা করেছি। মাইএসকিউএল v5.1.58 এ আমি একটি পরীক্ষা ইনোডিবি টেবিল তৈরি করেছি যাতে ENUM টাইপের 'বুল' নামে একটি ক্ষেত্র রয়েছে ('হ্যাঁ', 'না')।

তারপর আমি মৃত্যুদন্ড কার্যকর ...

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

...এবং এটা কাজ করে.

আমি কি কিছু ভুল করেছি? এটি ডিবি ইঞ্জিনের উপর নির্ভরশীল?
কেন সকলেই বলছেন একটি ENUM () তালিকা পরিবর্তন করা সম্ভব নয়? যেমন। এখানে http://komlenic.com/244/8-reason-why-mysqls-enum-data-type-is-evil/


3
আপনি যে নিবন্ধটি উল্লেখ করেছেন তা এটি অসম্ভব বলে দেয় না; এটি বলে যে সদস্য তালিকা পরিবর্তন করা ব্যয়বহুল কারণ ইঞ্জিন পূর্ণ টেবিল স্ক্যান করে।
a1ex07

আমি আপনার লিঙ্কটি ENUMs ( dba.stackexchange.com/a/6966/877 ) সম্পর্কে অক্টোবরে ফিরে উল্লেখ করেছি । অতিরিক্তভাবে, আমি মাইআইএসএএম ( dba.stackexchange.com/a/6548/877 ) এ কীভাবে এটি করতে পারি তার একটি রেফারেন্স পোস্ট করেছি । 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

বিরাট সমস্যা. জনবহুল টেবিলের মধ্যে হ্যাঁ এখন সম্ভবত। হ্যাঁ দিয়ে সন্নিবেশ করা নতুন সারিগুলি পূর্ববর্তী হ্যাঁ সারিগুলি থেকে সংযোগ বিচ্ছিন্ন হয়ে গেছে কারণ সেগুলি এখন সম্ভবত বোঝায়।

সারসংক্ষেপ

মাইআইএসএমে খুব দ্রুত এটি করার জন্য খুব ঝুঁকিপূর্ণ, টোপ এবং স্যুইচ কৌশল রয়েছে । আইবডাতা 1 এর সাথে টেবিল স্পেস আইডি ইন্টারঅ্যাকশন করার কারণে আমি InnoDB এ এটি করার বিরুদ্ধে দৃ strongly়ভাবে পরামর্শ দেব।


সুতরাং অভ্যন্তরীণভাবে ENUM () এর আদেশের উপর ভিত্তি করে int হিসাবে সংরক্ষণ করা হয়। উদাহরণস্বরূপ ENUM ('হ্যাঁ', 'না', 'হয়তো') অভ্যন্তরীণভাবে 'হ্যাঁ' এর জন্য 0, 'না' জন্য 1, 'সম্ভবত' এর জন্য 2 সঞ্চয় করে। আমি ধারণা করি যে টেবিলটির মেটাডেটা ENUM ('হ্যাঁ', 'না', 'সম্ভবত') এর পরিবর্তে ENUM ('হ্যাঁ = = 0,' না '=> 1,' হতে পারে '=> 2) এর মতো। এটা সত্যি?
আলেেক্স গবি

ENUM গুলি স্ট্রিংগুলি পূর্ণসংখ্যার নয়: dev.mysql.com/doc/refman/5.0/en/enum.html
RolandoMySQLDBA

আমি সম্মত হইলাম ENUM গুলি স্ট্রিং তবে অভ্যন্তরীণভাবে সেগুলি হয় না বা স্ট্রিং হিসাবে সংরক্ষণ করা হয় তাই না?
আলেেক্স গবি

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.এবং মান / সূচক মানচিত্রটি ধারণাগত ized সুতরাং, অভ্যন্তরীণ সূচক সংখ্যার সাথে যুক্ত কোনও টেবিলের একটি ENUM মান থাকবে। স্ট্রিংগুলি পুনরায় সাজানো মেটাডেটা সূচি পুনরায় সাজিয়ে তুলবে। এটি একটি ENUM পুনঃনির্ধারণ করার সময় একটি জনবহুল টেবিলের জন্য ভালভাবে বোড হয় না।
রোল্যান্ডোমাইএসকিউএলডিবিএ

2
কমপক্ষে MariaDB / InnoDB এর জন্য, আমি বলতে পারি এটি আর বৈধ নয়। ENUM এর মাঝামাঝি পরিবর্তন করা, যতক্ষণ না মান মুছে ফেলা / পরিবর্তিত হওয়ার কোনও রেকর্ড নেই, অন্য মানগুলি যেমন আছে তেমন থাকবে। একমাত্র সুবিধা হ'ল এটি টেবিলটি পুনর্নির্মাণ করতে হবে।
নুনো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.