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.