MySQL 서브쿼리는 버전 4.1.x 대부터 지원하고 있다.
MySQL Enum 타입은 Java enum 타입과 비슷한 유형이다.
컬럼 정의 시 다음과 같이 enum 컬럼에 들어갈 수 있는 항목들을 정의한다.
ENUM(value1, value2, value3...) value는 최대 65535 개까지 가능하다.
ENUM 데이터 타입은 캐릭터형 데이터 타입이며, 해당 칼럼에 들어올 수 있는 값을 지정해 줄 수 있다.
테이블 생성 시 주어진 list안의 데이터만 값을 입력 받고,
잘못 된 데이터는 "값으로 처리하는 데이터타입이다. 체크 제약조건이라고 볼 수 도 있다.
값으로도 조회가 가능하지만 index값으로도 제어가 가능하다.
index는 1부터 시작하고
다음과 같이 index값을 가지고 올 수 있다. index는 enum 정의 시 해당 항목의 위치값이다.
SELECT enum_col+0 FROM tbl_name;
정렬은 enum index 기준으로 정렬된다.
empty string은 noempty string보다 작은 것으로, null은 모든 값보다 작은 것으로 취급된다. (null < empty string < noempty string)
[장점]
- 데이터 용량을 적게 차지한다. 문자열은 자동적으로 숫자로 인코딩되어 저장되기 때문이다.(쿼리 결과에서 저장된 숫자는 대응되는 문자열로 변환)
'medium'이라는 값 100만개를 VARCHAR로 저장하려면 600만 bytes가 필요하지만 enum은 100만 byte만 필요하다. - 데이터의 정합성을 높일 수 있다. (유효하지 않은 값은 무효화되므로)
[단점]
- ENUM 컬럼에 대해 order by를 하면 추가적인 비용이 든다.
ENUM 항목 변경하는 작업이 수고롭다. 스키마 변경을 해야하고 삭제된 항목의 값을 가지는 컬럼에 대한 처리도 필요하다.(그냥 두면 무효화되므로 경우에 따라 마이그레이션 필요할 수도)
Enum 컬럼을 다른 테이블 FK로 사용한 경우 다른 테이블들까지 영향을 받게 된다. - 다른 DBMS로 이식성이 안좋다. (다른 DBMS는 ENUM 타입이 없으므로)
테이블 생성시에 ENUM ('Y','N')이런식으로 ENUM값을 넣어서 true false기능으로 활용도 가능하다.
ex) 게시판 글 delete시 ENUM이 N으로 기본 적용되어있는 게시글을 삭제할때
UPDATE 문으로 ENUM을 Y로 변경하고 , ENUM이 Y인 게시글은 화면에 표시되지 않게 만들어서
데이터는 보존하고 게시판글을 삭제할 수 있다.