Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 뷰(VIEW)를 활용해 CHECK 제약 조건을 에뮬레이트하는 방법

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 트리거가 더 적합한 대안이 될 수 있습니다.