MySQL은 참조 무결성을 위한 외래 키(Foreign Key)는 지원하지만, CHECK 제약 조건은 공식적으로 지원하지 않습니다. 하지만 WITH CHECK OPTION이 설정된 뷰(View)를 활용하면 CHECK 제약 조건과 유사한 효과를 얻을 수 있습니다. 아래 예제를 통해 그 방법을 살펴보겠습니다.
예제: 문제 상황
"영문자 2개 – 숫자 3개 – 영문자 2개"라는 고정된 형식의 차량 등록 번호를 저장하는 테이블 'car1'이 있다고 가정해 보겠습니다.
mysql> CREATE TABLE car1 (number CHAR(9));
Query OK, 0 rows affected (0.32 sec)
mysql> INSERT INTO car1 VALUES('AB-235-YZ');
Query OK, 1 row affected (0.10 sec)
'AB-235-YZ'는 정해진 형식을 따르는 유효한 값입니다. 그런데 다음과 같이 잘못된 형식의 값을 삽입하면 어떻게 될까요?
mysql> INSERT INTO car1 VALUES('AB-2X5-YZ');
Query OK, 1 row affected (0.04 sec)'AB-2X5-YZ'는 숫자가 들어가야 할 자리에 문자가 포함되어 있어 정해진 형식에 어긋나는 값입니다. 하지만 테이블에는 CHECK 제약 조건이 없기 때문에 MySQL은 이 잘못된 값을 아무런 오류 없이 그대로 저장해 버립니다.
뷰를 이용한 CHECK 제약 조건 에뮬레이트
이 문제를 해결하려면 정규 표현식으로 유효한 행만 조회하는 뷰를 만들고, WITH CHECK OPTION을 추가하면 됩니다. 이렇게 하면 뷰를 통해 INSERT나 UPDATE를 수행할 때 해당 조건을 만족하지 않는 데이터의 입력이 자동으로 차단됩니다.
mysql> CREATE VIEW car_invalid_check AS
-> SELECT * FROM car1 WHERE number RLIKE '^[[:alpha:]]{2}-[[:digit:]]{3}-[[:alpha:]]{2}$'
-> WITH CHECK OPTION;
Query OK, 0 rows affected (0.12 sec)
이제 이 뷰를 통해 데이터를 삽입하거나 수정해 보겠습니다.
# 형식에 어긋나는 값 삽입 시도 → 오류 발생
mysql> INSERT INTO car_invalid_check VALUES('AB-2X5-YZ');
ERROR 1369 (HY000): CHECK OPTION failed 'query.car_invalid_check'
# 형식에 맞는 값 삽입 → 정상 처리
mysql> INSERT INTO car_invalid_check VALUES('AB-235-YZ');
Query OK, 1 row affected (0.09 sec)
# 형식에 어긋나는 값으로 수정 시도 → 오류 발생
mysql> UPDATE car_invalid_check SET NUMBER = 'AB-2X5-ZT';
ERROR 1369 (HY000): CHECK OPTION failed 'query.car_invalid_check'
결과 분석
실행 결과에서 알 수 있듯이, 정규 표현식 ^[[:alpha:]]{2}-[[:digit:]]{3}-[[:alpha:]]{2}$ 조건을 만족하지 않는 값은 뷰를 통한 INSERT 또는 UPDATE 시점에 ERROR 1369(CHECK OPTION failed) 오류와 함께 거부됩니다. 반면 조건을 만족하는 값은 정상적으로 처리됩니다.
이처럼 MySQL에서 CHECK 제약 조건을 직접 사용할 수 없더라도, WITH CHECK OPTION이 설정된 뷰를 활용하면 데이터 입력 및 수정 단계에서 형식 검증을 강제할 수 있습니다. 참고로 트리거(TRIGGER)를 사용하는 방법도 있으며, 기존 애플리케이션이 테이블에 직접 접근하는 환경이라면 BEFORE INSERT/UPDATE 트리거가 더 적합한 대안이 될 수 있습니다.