ENUM () 목록을 변경할 수 있습니까?


19

ENUM () 목록을 변경할 수 있는지 확실하지 않으므로 테스트를 수행했습니다. MySQL v5.1.58에서는 ENUM ( 'yes', 'no') 유형의 'bool'이라는 하나의 필드를 포함하는 테스트 InnoDB 테이블을 만들었습니다.

그런 다음 나는 ...

ALTER TABLE  `test`
CHANGE  `bool`  `bool` ENUM(  'yes',  'no',  'maybe' )
CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL

... 그리고 효과가있었습니다.

내가 잘못 했어? DB 엔진에 의존합니까?
모든 사람이 ENUM () 목록을 변경할 수 없다고 말하는 이유는 무엇입니까? 예. 여기 http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/


3
당신이 언급 한 기사는 불가능하다고 말하지 않습니다. 엔진이 전체 테이블 스캔을 수행하기 때문에 멤버 목록 변경이 비용이 많이 든다고 말합니다.
— a1ex07

10 월에 ENUM ( dba.stackexchange.com/a/6966/877 ) 에 대한 링크를 언급했습니다 . 또한 MyISAM ( dba.stackexchange.com/a/6548/877 ) 에이 작업을 수행하는 방법에 대한 참조를 게시했습니다 . 이 경우 InnoDB는 의문의 여지가 없습니다.
— RolandoMySQLDBA

답변:


14

테이블이 비어있는 한 문제가 없습니다. 채워진 테이블에서 ENUM의 새 값이 추가되고 이름이 바뀌지 않는 한 다시 문제가 없습니다.

질문에서 재정의 한 ENUM은 테스트 테이블이 마지막으로 기억 한 것처럼 실제로 yes와 no의 원래 내부 값을 유지했습니다.

다음은 채워진 테이블에 적용됩니다.

이건 어때?

ALTER TABLE  `test`
CHANGE  `bool`  `bool` ENUM(  'no',  'yes',  'maybe' )
CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL

이제 문제가 있습니다. 완전히 채워진 테이블의 ENUM 값은 내부 값이 반대로되어 yes는 이제 no이고 no는 이제 yes입니다.

이건 어때?

ALTER TABLE  `test`
CHANGE  `bool`  `bool` ENUM(  'maybe', 'no',  'yes' )
CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL

큰 문제. 채워진 테이블에서 이제 예일 수 있습니다. yes로 삽입 된 새 행은 이전 yes 행과의 연결이 끊겼습니다.

요약

MyISAM에서는이 작업을 매우 빠르게 수행 할 수있는 매우 위험하고 미끼 및 스위치 기술이 있습니다. ibdata1과의 테이블 스페이스 ID 상호 작용으로 인해 InnoDB에서이 작업을 수행하지 않는 것이 좋습니다.


따라서 내부적으로 ENUM ()의 순서에 따라 int로 저장됩니다. 예를 들어 ENUM ( 'yes', 'no', 'maybe')는 내부적으로 'yes'에 대해 0, 'no'에 대해 1, 'maybe'에 대해 2를 저장합니다. 테이블의 메타 데이터가 ENUM ( 'yes'=> 0, 'no'=> 1, 'maybe'=> 2) 대신 ENUM ( 'yes', 'no', 'maybe')과 같다고 생각합니다. 사실인가요?
— Aalex Gabi

열거 형은 문자열이 아닌 정수 : dev.mysql.com/doc/refman/5.0/en/enum.html
— RolandoMySQLDBA

ENUM은 문자열이지만 내부적으로는 문자열이 아니므로 저장되지 않습니까?
— Aalex Gabi

1
이것에 맞습니다. 내가 제공 한 링크에는 메타 데이터로 문자열을 정수에 매핑하는 것이 있습니다. 이 구절을 찾으십시오 : For example, a column specified as ENUM('one', 'two', 'three') can have any of the values shown here. The index of each value is also shown.값 / 색인 맵이 개념화됩니다. 따라서 내부 색인 번호와 연관된 테이블에 ENUM 값이 있습니다. 문자열을 재정렬하면 메타 데이터 색인이 재정렬됩니다. ENUM을 재정의 할 때 채워진 테이블에 적합하지 않습니다.
— RolandoMySQLDBA

2
적어도 MariaDB / InnoDB의 경우 더 이상 유효하지 않다고 말할 수 있습니다. 값이 제거 / 변경된 레코드가 없으면 다른 값은 그대로 유지해야합니다. 유일한 장점은 테이블을 다시 작성해야한다는 것입니다.
— Nuno
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.