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

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

VIEW를 사용한 CHECK 제약 조건 에뮬레이트

MySQL은 참조 무결성(referential integrity)을 보장하기 위한 외래 키(foreign key)는 지원하지만, CHECK 제약 조건은 기본적으로 지원하지 않습니다. 하지만 뷰(VIEW)WITH CHECK OPTION을 설정하면 CHECK 제약 조건과 유사한 효과를 얻을 수 있습니다. 아래 예제를 통해 그 방법을 살펴보겠습니다.

예제: 차량 등록 번호 형식 검증

'car1'이라는 테이블이 있으며, 이 테이블의 등록 번호는 다음과 같은 고정된 형식을 따라야 한다고 가정합니다 — 영문자 2개 + 하이픈(-) + 숫자 3개 + 하이픈(-) + 영문자 2개.

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)

위 값은 유효한 형식입니다. 그렇다면 다음 쿼리에서 삽입하려는 값은 어떨까요?

mysql> INSERT INTO car1 VALUES('AB-2X5-YZ');
Query OK, 1 row affected (0.04 sec)

위 값은 숫자 사이에 문자가 포함되어 있어 정해진 형식에 어긋나므로 유효하지 않습니다. 하지만 일반 테이블에는 별도의 검증 없이 그대로 저장되어 버립니다.

VIEW 생성으로 INSERT·UPDATE 검증하기

INSERT 및 UPDATE 작업 시 CHECK 제약 조건을 에뮬레이트하려면 다음과 같이 뷰를 생성합니다.

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'

동작 원리

WITH CHECK OPTION이 설정된 뷰를 통해 데이터를 삽입하거나 수정하면, MySQL은 해당 행이 뷰의 WHERE 조건(여기서는 정규 표현식 패턴)을 만족하는지 검사합니다. 조건을 만족하지 못하는 데이터는 ERROR 1369 오류와 함께 거부됩니다.

  • 'AB-2X5-YZ' 삽입 시도 → 형식 불일치로 인해 실패
  • 'AB-235-YZ' 삽입 시도 → 형식 일치로 성공
  • UPDATE로 유효하지 않은 값으로 변경 시도 → 실패

이처럼 뷰와 WITH CHECK OPTION을 활용하면 CHECK 제약 조건이 없는 환경에서도 데이터 유효성 검사를 효과적으로 구현할 수 있습니다. 참고로 MySQL 8.0.16 버전부터는 CHECK 제약 조건이 기본적으로 지원되므로, 최신 버전을 사용한다면 해당 기능을 직접 활용하는 것이 더 좋습니다.