IT

MySQL의 ENUM 유형 열에 구성원을 추가하려면 어떻게 해야 합니까?

itgroup 2022. 10. 19. 22:11
반응형

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의 스테이트먼트입니다.

테이블 생성 출력 표시:

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 |
+----------------+
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';

그요? it it ?STRICT_TRANS_TABLES ★★★★★★★★★★★★★★★★★」STRICT_ALL_TABLES MySQL이 수 이 경우 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;

중요사항: 레거시 답변입니다.

제가 아삽과 나눈 토론은 우리가 꽤 많이 오갔기 때문에 이해하기 어려울 수도 있습니다.

향후 유사한 상황에 직면할 수 있는 다른 사람들에게 다음과 같은 혜택을 줄 수 있도록 우리의 담론의 최종 결과를 명확히 할 수 있을 것이라고 생각했다.

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정의된 멤버 세트가 변경되지 않을 경우.그렇지 않으면 조회 테이블을 업데이트 및 수정하기가 훨씬 쉬워집니다.

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');

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

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

참고: 유용한 시뮬레이션 도구 - phpMyAdmin with Wampserver 3.0.6 - Preview SQL: "Preview SQL"을 사용하여 열을 저장하기 전에 생성되는 SQL 코드를 확인합니다.SQL 미리보기

위에 표시된 것처럼 ENUM에 'Ford' 'Toyota'를 입력했지만 구문 오류를 생성하는 구문 ENUM(0)이 표시됩니다. 쿼리 오류 1064#

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

SQL 변경

이것은 자주 사용하는 퀵픽스로 변경이 필요한 기존 ENUM 값에도 사용할 수 있습니다.이게 도움이 될 것 같아서요

mysql data truncated for column 'status' at row 1 enum이전 값이 레코드에 있고 변경된 ENUM이 해당 값을 포함하지 않는 경우 새 열거 값을 추가하는 동안 위의 오류가 발생할 수 있습니다.

당신이 믿는다면 가능합니다.헤헤, 이 암호를 써 봐

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

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

새로운 가치를 추가한 후

언급URL : https://stackoverflow.com/questions/1501958/how-do-i-add-more-members-to-my-enum-type-column-in-mysql

반응형