MySQL의 열거 형 열에 더 많은 멤버를 추가하려면 어떻게합니까?

StackOverflow https://stackoverflow.com/questions/1501958

  •  19-09-2019
  •  | 
  •  

문제

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

더 많은 국가를 추가 해야하는 열거적인 국가 이름 열이 있습니다. 이를 달성하기 위해 올바른 MySQL 구문은 무엇입니까?

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

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

내가 얻는 오류는 다음과 같습니다. ERROR 1265 (01000): Data truncated for column 'country' at row 1.

그만큼 country 컬럼은 상기 진술의 열거 형 열입니다.

생성 테이블을 보여줍니다 산출:

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)

어떤 오류 가보고 있습니까?

fwiw 이것은 또한 작동합니다.

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이 귀하에게 제공한다는 일반적인 경고보다는 오류가 발생할 수 있습니다.

또 다른 편집 : 좋아요, 이제 당신은 테이블에 새로운 값이없는 것을 알았습니다. 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;

그만큼 논의 우리가 앞뒤로 갔을 때 나는 Asaph와 함께 가기가 불분명 할 수 있습니다.

나는 미래에 비슷한 상황에 처할 수있는 다른 사람들을위한 우리의 담론의 상향을 명확히 할 것이라고 생각했다.

ENUM-유형 기둥은 조작하기가 매우 어려운 짐승입니다. 나는 열거의 기존 국가에 두 나라 (말레이시아 & 스웨덴)를 추가하고 싶었다.

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

이것은 작동하지 않았습니다.

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

그 이유는 MySQL 명세서가 기존 열거를 항목을 포함하는 다른 열거로 대체했기 때문입니다. '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' 가치.

결론 :

만 사용합니다 ENUMs 회원 세트가 한 번 정의 된 후에 변경 될 것으로 기대하지 않을 때. 그렇지 않으면 조회 테이블을 업데이트하고 수정하기가 훨씬 쉽습니다.

MySQL Server 버전 : 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');

여기 또 다른 방법이 있습니다 ...

테이블 "formas"의 "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;

참고 : 유용한 시뮬레이션 도구 -Wampserver 3.0.6을 가진 phpmyadmin- 미리보기 SQL : '미리보기 SQL'을 사용하여 열에 열을 변경하여 열을 저장하기 전에 생성 될 SQL 코드를 확인합니다. 미리보기 SQL

위에서 당신은 내가 'Ford', 'Toyota'를 열거에 입력했지만 구문 오류를 생성하는 구문 ENUM (0)을 받고 있습니다. 쿼리 오류 1064#

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

SQL이 변경되었습니다

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

당신이 믿는다면 가능합니다. 헤헤. 이 코드를 시도하십시오.

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

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

새로운 가치를 추가 한 후

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top