it-swarm.asia

هل من الممكن تغيير قوائم ENUM ()؟

لم أكن متأكدًا مما إذا كان تغيير قائمة ENUM () غير ممكن ، لذا أجريت اختبارًا. في MySQL v5.1.58 قمت بعمل جدول اختبار InnoDB يحتوي على حقل واحد يسمى "bool" من النوع 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-reasons-why-mysqls-enum-data-type-is-evil/

19
Aalex Gabi

طالما أن الجدول فارغ ، فلا توجد مشكلة. طالما تم إلحاق القيم الجديدة لـ 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 . أنصح بشدة بعدم القيام بذلك في InnoDB بسبب تفاعل معرف مساحة الجدول مع ibdata1.

14
RolandoMySQLDBA