MySQL의 ENUM 타입은 특정 값 목록 중 하나만 저장할 수 있어 편리하지만, 사용 시 반드시 알아두어야 할 몇 가지 중요한 제약 사항이 있습니다. 이 글에서는 MySQL ENUM의 대표적인 한계 두 가지를 예제와 함께 살펴보겠습니다.
1. 열거형 값으로 표현식(Expression)을 사용할 수 없음
ENUM의 멤버 값에는 문자열 리터럴만 직접 지정할 수 있습니다. 결과가 문자열로 평가되는 표현식이라 하더라도 열거형 멤버로 사용하는 것은 허용되지 않습니다.
예제
예를 들어, 문자열을 반환하는 CONCAT() 함수를 사용하면 쿼리 실행이 실패합니다.
mysql> create table limit_enum(number ENUM('one', 'two', CONCAT('t','wo'));위 쿼리는 문법 오류를 발생시키며 테이블이 생성되지 않습니다. ENUM 값은 테이블 생성 시점에 고정된 리터럴 문자열로 정의해야 하기 때문입니다.
2. 사용자 변수(User Variable)를 열거형 멤버로 사용할 수 없음
또 다른 한계는 사용자 변수를 ENUM 멤버로 지정할 수 없다는 점입니다. 세션 변수에 문자열을 할당한 뒤 이를 ENUM 정의에 활용하려고 하면 역시 오류가 발생합니다.
예제
아래 쿼리는 정상적으로 동작하지 않습니다.
mysql> SET @mynumber = 'two';
Query OK, 0 rows affected (0.04 sec)
mysql> Create table limit_enum(number ENUM('one', @mynumber, 'three'));변수 @mynumber에 유효한 문자열이 담겨 있더라도, ENUM 정의에는 변수 참조가 허용되지 않기 때문에 테이블 생성에 실패합니다.
정리 및 대안
요약하면 MySQL ENUM은 테이블 생성 시점에 명시된 문자열 리터럴만 허용하며, 표현식이나 사용자 변수 같은 동적 요소는 사용할 수 없습니다. 만약 값 목록이 자주 변경되거나 유연성이 필요하다면, 별도의 참조(lookup) 테이블과 외래 키를 사용하거나 CHECK 제약 조건을 활용하는 것이 더 나은 설계 방법이 될 수 있습니다.