[mysql] MySQL에서 ENUM 타입 칼럼에 멤버를 추가하려면 어떻게해야합니까?

MySQL 참조 매뉴얼은이를 수행하는 방법에 대한 명확한 예를 제공하지 않습니다.

국가를 추가해야하는 ENUM 유형의 국가 이름 열이 있습니다. 이것을 달성하기위한 올바른 MySQL 구문은 무엇입니까?

내 시도는 다음과 같습니다.

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)

carmake 출력 에서 고유 한 국가를 선택하십시오 .

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



답변

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


답변

귀하의 코드가 저에게 효과적입니다. 내 테스트 사례는 다음과 같습니다.

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)

어떤 오류가 나타 납니까?

다음과 같이 작동합니다.

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

실제로 열거 형 열이 아닌 국가 테이블을 권장합니다. 다소 크고 어색한 열거 형을 만드는 수백 개의 국가가있을 수 있습니다.

편집 : 이제 오류 메시지가 표시됩니다.

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? 이 상황에서 MySQL이 알려주는 일반적인 경고보다는 오류가 발생할 수 있습니다.

또 다른 편집 : 이제 테이블에 new에없는 값이 있음을 알았습니다 ENUM. 새로운 ENUM정의는 'Sweden'and 만 허용 'Malaysia'합니다. 표는있다 'USA', 'India'그리고 몇몇 다른 사람.

마지막 편집 (MAYBE) :이 작업을 수행하려는 것 같습니다.

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


답변

토론 우리가 앞뒤로 꽤 갔다 나는이 아삽과 함께했다 따를 불분명 할 수있다.

나는 미래에 비슷한 상황에 처할 수있는 다른 사람들을 위해 우리의 담론의 결말을 분명히 밝힐 수 있다고 생각했습니다.

ENUM유형 컬럼은 조작하기가 매우 어려운 짐승입니다. ENUM의 기존 국가 세트에 두 국가 (말레이시아 및 스웨덴)를 추가하고 싶었습니다.

MySQL 5.1 (내가 실행중인 것)은 내가 원하는 것 외에도 기존 세트를 재정 의하여 ENUM 만 업데이트 할 수있는 것 같습니다.

이것은 작동하지 않았다 :

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

그 이유는 MySQL의 문이 또 다른 항목을 포함하여 기존 ENUM를 교체 한 것이 었습니다 'Malaysia''Sweden'단지. MySQL은 때문에 오류를 던졌다 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정의 된 멤버 집합이 변경되지 않을 경우 에만 s를 사용 하십시오. 그렇지 않으면 조회 테이블을 업데이트하고 수정하기가 훨씬 쉽습니다.


답변

MYSQL 서버 버전 : 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');


답변

참고 : 유용한 시뮬레이션 도구-phpMyAdmin with Wampserver 3.0.6-Preview SQL : ‘Preview SQL’을 사용하여 ENUM 변경으로 열을 저장하기 전에 생성되는 SQL 코드를 봅니다. SQL 미리보기

위의 ENUM에 ‘Ford’, ‘Toyota’를 입력했지만 구문 오류가 발생하는 구문 ENUM (0)이 표시됩니다. 쿼리 오류 1064 #

그런 다음 SQL을 복사하여 붙여넣고 변경하고 SQL을 통해 실행하여 긍정적 인 결과를 얻습니다.

SQL이 변경됨

이것은 내가 자주 사용하는 빠른 수정이며 변경해야하는 기존 ENUM 값에도 사용할 수 있습니다. 이것이 유용 할 것이라고 생각했습니다.


답변

다른 방법이 있습니다 …

“firmas”테이블의 “rtipo”열에 대한 열거 정의에 “others”를 추가합니다.

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;


답변

당신이 믿는다면 가능합니다. 헤헤 이 코드를 사용해보십시오.

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)");
  }

새로운 가치를 추가하기 전에

새로운 가치를 더한 후