আমি কি একটি প্রশ্নের মধ্যে একটি মাইএসকিউএল 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

আমি যে ফলোলিংয়ের কৌশলটি প্রদর্শন করতে চলেছি তার জন্য আপনাকে স্টিলের সাহস প্রয়োজন।

নিম্নলিখিত মানদণ্ড দেওয়া

  • দাতাদির /var/lib/mysql
  • টেবিল হয় mydb.mytb
  • যাকে এনাম কলাম বলা হয় enum_col
  • ইঞ্জিনটি মাইআইএসএএম

এটি এখানে একটি মৃত্যু-বিস্মৃত ক্র্যাক:

  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. একটি পৃথক ওএস / এসএসএইচ সেশনে .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;

এটাই !!!

কভিয়েট: আমি এটির জন্য ক্রেডিট নিতে পারি না!

এই কৌশলটি থেকে আসে , পৃষ্ঠাগুলি 146-148: "অপ্টিমাইজেশান, ব্যাকআপ, আত্ম, এবং আরও হাই পারফরমেন্স মাইএসকিউএল" উপশিরোনামের নীচে দেওয়া দ্রুত গাড়ী চালানোর আপ ALTER টেবিল । পৃষ্ঠা 147 অনুচ্ছেদ 1 বলেছেন:

আমরা যে কৌশলটি প্রদর্শন করতে চলেছি তা অসমর্থিত, অনাবৃত, এবং এটি কার্যকর নাও হতে পারে। আপনার ঝুঁকিতে এটি ব্যবহার করুন। আমরা আপনাকে প্রথমে আপনার ডেটা ব্যাক আপ করার পরামর্শ দিচ্ছি!

একবার চেষ্টা করে দেখো ! (দয়া করে এটি আমাদের কীভাবে চালু হয়েছিল তা জানান)

আপডেট করুন ২০১০-১০-০৫ 17:49 ইডিটি

যদি টেবিলটি মাইআইএসএএম হয় এবং আপনার উত্পাদন পর্যাপ্ত জায়গা এবং একটি সরাসরি-আপ ডাউনটাইম উইন্ডো থাকে তবে এটি ব্যবহার করে দেখুন:

  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- প্রতিস্থাপনের সাথে এনাম 2 এ কলামের মানটি অনুলিপি করুন:

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

3- ড্রপ কলাম column, পুনঃনামকরণ enumকরা column

দ্রষ্টব্য : এই প্রশ্নটি ২০১১-১০-০৫-এ ফিরে আসবে, আমার সমাধান এমওয়াইএসকিউএল ৪.১ এবং আরও নতুন (এএফআইকে) এর জন্য বৈধ


যদিও এটি একটি ভাল সমাধান বলে মনে হচ্ছে (এবং এটি গ্রহণযোগ্য উত্তরের মতো স্নায়ু-ধড়ফড় করার মতো নয়), এটি উল্লেখযোগ্য যে 3 ধাপে কমপক্ষে একটি ALTER TABLEবিবৃতি প্রয়োজন, এবং ওপি এমন কিছু সন্ধান করছে যা কেবলমাত্র একটি প্রয়োজন। আবার, এটি বলেছিল, এটি একটি নিখুঁত স্ট্যান্ডার্ড, কঠিন সমাধান বলে মনে হচ্ছে।
আরডিফোজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.