본문 바로가기
DataBase/MySQL

MySql Enum Table 생성/수정

by 빅경 2024. 5. 28.
728x90
반응형

컬럼 정의 시 다음과 같이 enum 컬럼에 들어갈 수 있는 항목들을 정의한다.

ENUM Table 생성

CREATE TABLE SHIRTS (
  name VARCHAR(40),
  size ENUM('small', 'medium', 'large')
);

 

ENUM 항목 수정

ALTER TABLE SHIRTS MODIFY COLUMN size ENUM('x-small', 'small', 'medium', 'large', 'x-large') not null default 'medium' COMMENT '';

 

enum 컬럼도 empty string이나 null값 삽입 가능하고 empty string은 유효하지 않은 값으로 취급된다. enum 항목이 없어지면 기존에 있던 삭제된 그 항목을 가지고 있던 컬럼값은 유효하지 않은 상태(empty string)로 변경된다.

다음과 같이 index값을 가지고 올 수 있다. index는 enum 정의 시 해당 항목의 위치값이다. 주의할 것은 index는 1부터 시작한다. (0은 유효하지 않은 값의 index로 사용된다.)

SELECT enum_col+0 FROM SHIRTS;

 

Insert 시에 enum에 정의되지 않은 항목도 넣을 수 있는데 유효하지 않은 값(empty string)으로 삽입된다(strict SQL mode에서는 에러 발생함). 정렬은 enum index 기준으로 정렬된다. empty string은 no empty string보다 작은 것으로, null은 모든 값보다 작은 것으로 취급된다. (null < empty string < noempty string)

만약 alphabetic 순서로 정렬하고 싶다면 두 가지 방법이 있다. enum 항목 정의 시 alphabetic한 순서대로 항목을 정의한다. ORDER BY CAST(column AS CHAR) 이렇게 사용한다.

장점

  • 데이터 용량을 적게 차지한다. 문자열은 자동적으로 숫자로 인코딩되어 저장되기 때문이다.(쿼리 결과에서 저장된 숫자는 대응되는 문자열로 변환)
  • 데이터의 정합성을 높일 수 있다. (유효하지 않은 값은 무효화되므로)

단점

  • ENUM 컬럼에 대해 order by를 하면 추가적인 비용이 든다.
  • ENUM 항목 변경하는 작업이 수고롭다. 스키마 변경을 해야하고 삭제된 항목의 값을 가지는 컬럼에 대한 처리도 필요하다.(그냥 두면 무효화되므로 경우에 따라 마이그레이션 필요할 수도)Enum 컬럼을 다른 테이블 FK로 사용한 경우 다른 테이블들까지 영향을 받게 된다.
  • 다른 DBMS로 이식성이 안좋다. (다른 DBMS는 ENUM 타입이 없으므로)
728x90
반응형