আমি কীভাবে মাইএসকিউএলে আমার ENUM- টাইপ কলামে আরও সদস্য যুক্ত করব?


157

মাইএসকিউএল রেফারেন্স ম্যানুয়ালটি কীভাবে এটি করা যায় সে সম্পর্কে একটি ক্লিয়ারকাট উদাহরণ সরবরাহ করে না।

আমার কাছে দেশের নামের একটি ENUM- টাইপ কলাম রয়েছে যাতে আমার আরও দেশ যুক্ত করতে হবে। এটি অর্জনের জন্য সঠিক মাইএসকিউএল সিনট্যাক্সটি কী?

এখানে আমার প্রচেষ্টা:

ALTER TABLE carmake CHANGE country country ENUM('Sweden','Malaysia');

আমি যে ত্রুটি পেয়েছি তা হ'ল: ERROR 1265 (01000): Data truncated for column 'country' at row 1.

countryকলাম ওপরে বিবৃতিতে ENUM-টাইপ কলাম হয়।

টেবিল আউটপুট তৈরি করুন :

mysql> SHOW CREATE TABLE carmake;
+---------+---------------------------------------------------------------------+
| Table   | Create Table
+---------+---------------------------------------------------------------------+
| carmake | CREATE TABLE `carmake` (
`carmake_id` tinyint(4) NOT NULL AUTO_INCREMENT,
`name` tinytext,
`country` enum('Japan','USA','England','Australia','Germany','France','Italy','Spain','Czech Republic','China','South Korea','India') DEFAULT NULL,
PRIMARY KEY (`carmake_id`),
KEY `name` (`name`(3))
) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=latin1 |
+---------+---------------------------------------------------------------------+
1 row in set (0.00 sec)

কারমেক আউটপুট থেকে পৃথক দেশ নির্বাচন করুন :

+----------------+
| country        |
+----------------+
| Italy          |
| Germany        |
| England        |
| USA            |
| France         |
| South Korea    |
| NULL           |
| Australia      |
| Spain          |
| Czech Republic |
+----------------+

উত্তর:


134
ALTER TABLE
    `table_name`
MODIFY COLUMN
    `column_name2` enum(
        'existing_value1',
        'existing_value2',
        'new_value1',
        'new_value2'
    )
NOT NULL AFTER `column_name1`;

7
বেশিরভাগ অল্টার টেবল কমান্ড পুরো টেবিলটি সম্পূর্ণ নতুন করে লিখবে rite এনএসএমএল দিয়ে এনএসএল না করার পক্ষে কি যথেষ্ট চালাক?
জন

এনুম কেবল একটি অভিনব পূর্ণসংখ্যার সাথে একটি স্ট্রিং প্রতিনিধিত্ব করে। শেষ পর্যন্ত আইটেম যুক্ত করা ভাল, যেহেতু আপনি কেবল পুরানো মানগুলি যুক্ত করেন। তবে ক্রম পরিবর্তন / এনামগুলি অপসারণ করলে সেই সংখ্যাগুলি সংজ্ঞায়িত হবে। (উদাঃ 1 => ইতালি, 2 => জার্মানি), তারপরে প্রসারিত হবে (1 => ইতালি, 2 => জার্মানি, 3 => সোয়েনডেন)।
লিনতাব

1
@ জন নির্ভর করে। মারিয়াডিবি-র জন্য, inplaceএনামের শেষে নতুন মান যুক্ত করা 10.3.7 থেকে করা যেতে পারে : mariadb.com/kb/en/library/…
ফিলিপ ফিলিপ

99

আপনার কোড আমার জন্য কাজ করে। এখানে আমার পরীক্ষার মামলাটি রয়েছে:

mysql> CREATE TABLE carmake (country ENUM('Canada', 'United States'));
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW CREATE TABLE carmake;
+---------+-------------------------------------------------------------------------------------------------------------------------+
| Table   | Create Table                                                                                                            |
+---------+-------------------------------------------------------------------------------------------------------------------------+
| carmake | CREATE TABLE `carmake` (
  `country` enum('Canada','United States') default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
+---------+-------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> ALTER TABLE carmake CHANGE country country ENUM('Sweden','Malaysia');
Query OK, 0 rows affected (0.53 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW CREATE TABLE carmake;
+---------+--------------------------------------------------------------------------------------------------------------------+
| Table   | Create Table                                                                                                       |
+---------+--------------------------------------------------------------------------------------------------------------------+
| carmake | CREATE TABLE `carmake` (
  `country` enum('Sweden','Malaysia') default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
+---------+--------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

আপনি কোন ত্রুটি দেখতে পাচ্ছেন?

FWIW এটি কাজ করবে:

ALTER TABLE carmake MODIFY COLUMN country ENUM('Sweden','Malaysia');

আমি আসলে এনাম কলামের পরিবর্তে কোনও দেশের টেবিলের প্রস্তাব দেব recommend আপনার শত শত দেশ থাকতে পারে যা একটি বৃহত এবং বিশ্রী এনামের জন্য তৈরি করবে।

সম্পাদনা: এখন আমি আপনার ত্রুটি বার্তাটি দেখতে পাচ্ছি:

ERROR 1265 (01000): Data truncated for column 'country' at row 1.

আমি সন্দেহ করি আপনার দেশের কলামে আপনার কিছু মান রয়েছে যা আপনার কাছে উপস্থিত হয় না ENUM। নিম্নলিখিত কমান্ডের ফলাফল কি?

SELECT DISTINCT country FROM carmake;

অন্য সম্পাদনা: নিম্নলিখিত কমান্ডের ফলাফল কী?

SHOW VARIABLES LIKE 'sql_mode';

এটা STRICT_TRANS_TABLESনাকি STRICT_ALL_TABLES? মাইএসকিউএল আপনার এই পরিস্থিতিতে আপনাকে দেওয়া স্বাভাবিক সতর্কতার চেয়ে এটি একটি ত্রুটি হতে পারে।

অন্য কোনও সম্পাদনা করুন: ঠিক আছে, আমি এখন দেখতে পাচ্ছি যে টেবিলে আপনার অবশ্যই মান আছে যা নতুন নয় ENUM। নতুন ENUMসংজ্ঞা কেবল অনুমতি দেয় 'Sweden'এবং 'Malaysia'। টেবিল রয়েছে 'USA', 'India'এবং বেশ কিছু অন্যদের।

সর্বশেষ সম্পাদনা (মায়াবী): আমি মনে করি আপনি এটি করার চেষ্টা করছেন:

ALTER TABLE carmake CHANGE country country ENUM('Italy', 'Germany', 'England', 'USA', 'France', 'South Korea', 'Australia', 'Spain', 'Czech Republic', 'Sweden', 'Malaysia') DEFAULT NULL;

আমার carmakeটেবিলে একাধিক কলাম রয়েছে। এর সাথে কি কিছু করতে পারে?
জায়েদ

1
@ জায়েদ এটি বলার বিষয়ে সাবধান হন। মাইএসকিউএল ENUM কলামগুলিতে আবর্জনা অনুমতি দেওয়ার জন্য কুখ্যাত। উদাহরণস্বরূপ এটি নীরবে নিরপেক্ষ মানগুলিকে খালি স্ট্রিংয়ে রূপান্তর করবে। আপনি কি 100% নিশ্চিত যে আপনার কোনও আপত্তিজনক মান নেই? খালি স্ট্রিং নেই? কোনও শীর্ষস্থানীয় বা পূর্ববর্তী শ্বেতস্থান নেই? মামলার পার্থক্য? উচ্চারণ করা অক্ষর?
আসফ

1
@ জায়েদ আমি মনে করি আপনার টেবিলের এমন মান আছে যা আপনার আপডেট হওয়া ENUM সংজ্ঞা থেকে অনুপস্থিত। আপনার নতুন সংজ্ঞাটি কেবল সুইডেন এবং মালয়েশিয়ার অনুমতি দেয়। আপনার টেবিলটিতে মার্কিন যুক্তরাষ্ট্র, ভারত, জার্মানি রয়েছে ... আপনার নতুন ENUM তে এই মানগুলির কোনওটিরই অনুমতি দেওয়া হবে না। আপনি যদি এনএনএম এর মূল সদস্যদের সংরক্ষণের জন্য সুইডেন এবং মালয়েশিয়া যুক্ত করার চেষ্টা করছেন তবে আপনার সমস্ত মূল এনইউএম মানগুলি এবং আপনার অলটার বিবৃতিতে 2 টি নতুন প্রতিরোধ করতে হবে।
আসফ

2
@ জায়েদ আপনাকে স্বাগতম আমি প্রথম দিকে পরামর্শ মতো ENUM এর পরিবর্তে কোনও বিদেশী কীযুক্ত কোনও দেশ টেবিলে ব্যবহার করলে আপনি কেবল নতুন দেশগুলির জন্য সারি যুক্ত করতে সক্ষম হবেন। বিটিডাব্লু: যদি আপনি আমার পরামর্শগুলি সহায়ক বলে মনে করেন তবে দয়া করে আমার উত্তরটি সঠিকভাবে চিহ্নিত করুন :)
আশাফ

3
-1 আসল সমাধানটি এখানে কী তা নিয়ে স্পষ্টতার অভাবের জন্য। এখানে অনেক কথোপকথন এবং প্রচুর "এটি চেষ্টা করুন, ওহ পরিবর্তে এটির চেষ্টা করুন।" প্রাথমিক প্রতিক্রিয়া এমনকি ওপি-র আসল প্রশ্নেরও উত্তর দেয় না - পরে সমস্যাটি কী তা আপনি বুঝতে পেরেছিলেন, এবং তারপরে আপনি সাধারণ কোডের নমুনায় চলে যান যা এই প্রশ্ন / উত্তরটি খুঁজে পাচ্ছেন এমন ব্যক্তির পক্ষে আসলে কিছুই বোঝায় না পরবর্তী সময়ে. আপনার সম্পাদনাগুলির প্রসঙ্গটি অস্থায়ী / এবং তা আর স্পষ্ট নয়।
জিম রুবেস্টাইন 14

73

আলোচনা যেমন আমরা আগে পিছে বেশ একটু গিয়েছিলাম আমি আসফ সঙ্গে ছিল অনুসরণ করতে অস্পষ্ট হতে পারে।

আমি ভেবেছিলাম যে ভবিষ্যতে একইরকম পরিস্থিতির মুখোমুখি হতে পারে এমন লোকদের জন্য আমি আমাদের বক্তৃতাটির ফলাফলটি পরিষ্কার করতে পারি:

ENUM-ধরনের কলামগুলি ম্যানিপুলেট করা খুব কঠিন প্রাণী। আমি আমার ENUM- তে বিদ্যমান সংস্থাগুলিতে দুটি দেশ (মালয়েশিয়া এবং সুইডেন) যুক্ত করতে চেয়েছিলাম।

দেখে মনে হয় যে মাইএসকিউএল 5.1 (যা আমি চালাচ্ছি) কেবলমাত্র আমি চাই তা ছাড়া বিদ্যমান সেটটিকে নতুন করে সংজ্ঞায়িত করে ENUM আপডেট করতে পারে:

এটি কার্যকর হয়নি:

ALTER TABLE carmake CHANGE country country ENUM('Sweden','Malaysia') DEFAULT NULL;

কারণটি ছিল যে মাইএসকিউএল স্টেটমেন্টটি বিদ্যমান এনইউএমটিকে অন্য একটি এন্ট্রি যুক্ত 'Malaysia'এবং 'Sweden'কেবলমাত্র দ্বারা প্রতিস্থাপন করছে । কারণ মাইএসকিউএল একটি ত্রুটি বমি করেছিলাম carmakeটেবিল ইতিমধ্যে মান পছন্দ 'England'এবং 'USA'যা নতুন অংশ ছিল না ENUM'এর সংজ্ঞা।

আশ্চর্যজনকভাবে, নিম্নলিখিতগুলিও কার্যকর হয়নি:

ALTER TABLE carmake CHANGE country country ENUM('Australia','England','USA'...'Sweden','Malaysia') DEFAULT NULL;

দেখা যাচ্ছে যে এমনকি ENUMএতে নতুন সদস্য যুক্ত করার সময় বিদ্যমান উপাদানগুলির উপাদানগুলির ক্রমও সংরক্ষণ করা দরকার। সুতরাং যদি আমার বিদ্যমানটি ENUMদেখতে কিছু দেখতে লাগে ENUM('England','USA')তবে আমার ENUMনতুনটিকে সংজ্ঞায়িত করতে হবে ENUM('England','USA','Sweden','Malaysia')এবং তা নয় ENUM('USA','England','Sweden','Malaysia')। বিদ্যমান সারণীতে রেকর্ড রয়েছে যা ব্যবহার 'USA'বা 'England'মান ব্যবহার করে এই সমস্যাটি তখনই প্রকাশিত হয় ।

শেষের সারি:

কেবলমাত্র ENUMতখনই ব্যবহার করুন যখন আপনি নিজের সদস্যদের সেটটি একবার সংজ্ঞায়িত হয়ে পরিবর্তন করার প্রত্যাশা করবেন না। অন্যথায়, অনুসন্ধান সারণী আপডেট এবং সংশোধন করা অনেক সহজ much


আমি একটি শক্তিশালী নীচের লাইনের উদ্যোগ নেব ... "আপনি যখন 100% মৃত কিছু ইতিবাচক হন তবে মানগুলি কখনই বদলাবে না" কেবল ENUM ব্যবহার করুন। যদি কোনও টেবিলটি বড় হয় তবে আপনার যদি সেই মানগুলি পরিবর্তন করতে হয় তবে এটি ব্যথা হবে।
ডগডাব্লু

6
আমি নিশ্চিত নই যে আমি এই নীচের লাইনের সাথে একমত। বিশ্বাস করুন আমি ENUM এর মোটেও পছন্দ করি না তবে আমি সম্ভাব্য ENUM এ যুক্ত হওয়ার ঝুঁকিটি দেখতে পাচ্ছি না। ENUM এটির মূল, 0 -> বিকল্প 1, 1-> বিকল্প 2 ইত্যাদির একটি ম্যাপিং etc. ইত্যাদি এতে যুক্ত করা কোনও সমস্যার কারণ হবে না।
জোশস্ট্রঞ্জ

2
@ জোস্টস্ট্রেঞ্জ এটি এত বিপদজনক নয়, যখন আপনার ENUM ক্রমটি গুরুত্বপূর্ণ (উদাহরণস্বরূপ, যখন অর্ডার দেওয়ার জন্য ব্যবহৃত হয়) তখন এটি একটি বিশাল অসুবিধা হতে পারে।
1in9ui5t

1
আমি মনে করি এটি নীচের পংক্তিতেও বলা গুরুত্বপূর্ণ যে এটি কেবল মাইএসকিউএল এর উত্তরাধিকার সংস্করণগুলির সাথে বৈধ যা আমি যা বুঝি তার জন্য নতুনদের সাথে কোনও সমস্যা নেই।
নিকোলো

এই উত্তরটি আর প্রাসঙ্গিক নয়, নীচের একটিটি গ্রহণযোগ্য হিসাবে চিহ্নিত করা উচিত।
ofirski

16

এমওয়াইএসকিউএল সার্ভার সংস্করণে: 5.0.27 আমি এটি চেষ্টা করেছি এবং এটি আপনার সংস্করণে যাচাই করে আমার পক্ষে ভাল কাজ করেছে

ALTER TABLE carmake
     MODIFY `country` ENUM('Japan', 'USA', 'England', 'Australia', 'Germany', 'France', 'Italy', 'Spain', 'Czech Republic', 'China', 'South Korea', 'India', 'Sweden', 'Malaysia');

1
নিশ্চিত হবেন না কেন এটি আরও উত্সাহিত হয়নি। এটি সহজ, এবং এটি আমার পক্ষে কাজ করে।
পৈতৃক

1

এফওয়াইআই: একটি দরকারী সিমুলেশন সরঞ্জাম - ওয়্যাম্পসারভার 3.0.০. with সহ পিএইচপিএমইএডমিন - পূর্বরূপ এসকিউএল: আপনি এনএমএমে পরিবর্তনের সাথে কলামটি সংরক্ষণ করার আগে তৈরি হওয়া এসকিউএল কোডটি দেখতে 'প্রিভিউ এসকিউএল' ব্যবহার করি। পূর্বরূপ এসকিউএল

উপরে আপনি দেখতে পাচ্ছেন যে আমি ENUM তে 'ফোর্ড', 'টয়োটা' প্রবেশ করিয়েছি তবে আমি সিনট্যাক্স ENUM (0) পাচ্ছি যা সিনট্যাক্স ত্রুটি তৈরি করছে প্রশ্নের ত্রুটি 1064 #

আমি তখন অনুলিপি করে আটকানো এবং এসকিউএল পরিবর্তন করে এবং এসকিউএল এর মাধ্যমে একটি ইতিবাচক ফলাফল সহ এটি চালিত করি।

এসকিউএল পরিবর্তিত হয়েছে

এটি এমন একটি কুইকফিক্স যা আমি প্রায়শই ব্যবহার করি এবং বিদ্যমান ENUM মানগুলিতেও পরিবর্তন করা দরকার। ভেবেছি এটি কার্যকর হতে পারে।


1

এখানে অন্য উপায় ...

এটি "অন্যকে" টেবিলের "rtipo" কলাম "ফার্মাস" এর এনাম সংজ্ঞাতে যুক্ত করে।

set @new_enum = 'others';
set @table_name = 'firmas';
set @column_name = 'rtipo';
select column_type into @tmp from information_schema.columns 
  where table_name = @table_name and column_name=@column_name;
set @tmp = insert(@tmp, instr(@tmp,')'), 0, concat(',\'', @new_enum, '\'') );
set @tmp = concat('alter table ', @table_name, ' modify ', @column_name, ' ', @tmp);
prepare stmt from @tmp;
execute stmt;
deallocate prepare stmt;

-8

বিশ্বাস করা সম্ভব। হে হে। এই কোড চেষ্টা করুন।

public function add_new_enum($new_value)
  {
    $table="product";
    $column="category";
         $row = $this->db->query("SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_NAME = ? AND COLUMN_NAME = ?", array($table, $column))->row_array();

    $old_category = array();
    $new_category="";
    foreach (explode(',', str_replace("'", '', substr($row['COLUMN_TYPE'], 5, (strlen($row['COLUMN_TYPE']) - 6)))) as $val)
    {
        //getting the old category first

        $old_category[$val] = $val;
        $new_category.="'".$old_category[$val]."'".",";
    }

     //after the end of foreach, add the $new_value to $new_category

      $new_category.="'".$new_value."'";

    //Then alter the table column with the new enum

    $this->db->query("ALTER TABLE product CHANGE category category ENUM($new_category)");
  }

নতুন মান যুক্ত করার আগে

নতুন মান যুক্ত করার পরে


11
আমি দেখতে পাচ্ছি না কীভাবে এটি টেবিলটিতে নতুন কিছু নিয়ে আসে। প্রশ্নটি নিখুঁতভাবে একটি মাইএসকিউএল অবস্থান থেকে point আপনার উত্তরটি এলোমেলো পিএইচপি অন্তর্ভুক্ত করে যা সম্পূর্ণ অপ্রাসঙ্গিক এবং আপনি এর কোনও ব্যাখ্যা দেওয়ার জন্য কোনও প্রচেষ্টা করেন না। অকেজো তথ্যের সংস্থান
জোনাথন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.