MySQL ENUM 타입과 NOT NULL의 관계
MySQL에서 ENUM 데이터 타입은 정해진 값 목록 중 하나만 저장할 수 있는 편리한 자료형입니다. 그런데 이때 NOT NULL 제약 조건을 선언했는지 여부에 따라, 아무 값도 지정하지 않고 레코드를 삽입할 때의 기본 동작이 달라집니다.
- NOT NULL을 선언하지 않은 경우 → 기본값으로
NULL이 저장됩니다. - NOT NULL을 선언한 경우 → ENUM 목록의 첫 번째 값이 기본값으로 저장됩니다.
아래 두 가지 경우를 실제 예제를 통해 확인해 보겠습니다.
CASE 1 — NOT NULL 없이 선언한 경우 (NULL 반환)
먼저 일반적인 ENUM 컬럼을 가진 테이블을 생성합니다.
mysql> create table DemoTable1(isMarried ENUM('YES','NO'));
Query OK, 0 rows affected (0.76 sec)insert 명령으로 값을 지정하지 않은 레코드를 삽입합니다.
mysql> insert into DemoTable1 values();
Query OK, 1 row affected (0.18 sec)
select 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select *from DemoTable1;
실행 결과는 다음과 같습니다.
+-----------+
| isMarried |
+-----------+
| NULL |
+-----------+
1 row in set (0.00 sec)
NOT NULL 제약이 없기 때문에, 값을 지정하지 않은 레코드에는 NULL이 그대로 저장된 것을 확인할 수 있습니다.
CASE 2 — NOT NULL을 선언한 경우 (첫 번째 값 반환)
이번에는 같은 구조의 테이블에 NOT NULL을 추가하여 생성합니다.
mysql> create table DemoTable2 (isMarried ENUM('YES','NO') NOT NULL);
Query OK, 0 rows affected (0.57 sec)마찬가지로 값을 지정하지 않고 레코드를 삽입합니다.
mysql> insert into DemoTable2 values();
Query OK, 1 row affected (0.17 sec)
select 문으로 조회해 보겠습니다.
mysql> select *from DemoTable2;
실행 결과는 다음과 같습니다.
+-----------+
| isMarried |
+-----------+
| YES |
+-----------+
1 row in set (0.00 sec)
컬럼이 NOT NULL로 선언되어 있어 NULL을 허용하지 않으므로, MySQL은 ENUM 목록에서 가장 앞에 정의된 값인 'YES'를 기본값으로 자동 저장했습니다.
정리
| 선언 방식 | 값 미지정 시 저장되는 기본값 |
|---|---|
| ENUM('YES','NO') | NULL |
| ENUM('YES','NO') NOT NULL | 'YES' (목록의 첫 번째 값) |
따라서 ENUM 컬럼을 설계할 때는 NOT NULL 여부가 의도치 않은 기본값 삽입으로 이어질 수 있음을 항상 염두에 두어야 합니다. 특히 NOT NULL을 사용하는 경우, 목록의 첫 번째 값이 실제로 적절한 기본값인지 신중하게 결정하는 것이 좋습니다.