데이터가 테이블에 삽입되기 이전에 특정 로직을 실행해야 하는 경우, MySQL의 BEFORE INSERT 트리거를 사용하면 됩니다. 이 트리거는 INSERT 문이 실제로 실행되기 전에 자동으로 호출되므로, 조건 검사나 데이터 검증 등의 작업을 수행하는 데 매우 유용합니다.
BEFORE INSERT 트리거 기본 문법
삽입 작업 전에 트리거를 생성하는 기본 문법은 다음과 같습니다.
delimiter //
create trigger yourTriggerName before insert on yourTableName
FOR EACH ROW
BEGIN
yourStatement1
.
.
N
END
//
delimiter ;
위 문법을 더 잘 이해하기 위해 실제 예제를 통해 살펴보겠습니다.
1단계: 예제 테이블 생성
먼저 테스트에 사용할 테이블을 생성합니다.
mysql> create table DemoTable1919
(
Value int
);
Query OK, 0 rows affected (0.00 sec)
2단계: BEFORE INSERT 트리거 생성
다음은 삽입 작업 전에 실행되는 트리거를 생성하는 쿼리입니다. 이 트리거는 테이블에 저장된 값들의 합이 60일 경우 새로운 레코드 삽입을 차단하고 사용자에게 오류 메시지를 반환합니다.
mysql> delimiter //
mysql> create trigger sumis60 before insert on DemoTable1919
FOR EACH ROW
BEGIN
declare custom_message varchar(256);
IF (SELECT sum(Value) from DemoTable1919) = 60 THEN
set custom_message= "cannot insert because sum(Value) is greater than 60";
signal sqlstate '13500'
set message_text= custom_message;
END IF;
END
//
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
여기서 핵심 포인트는 다음과 같습니다.
SIGNAL SQLSTATE구문을 사용하면 조건이 충족될 때 의도적으로 오류를 발생시켜 삽입 작업을 중단할 수 있습니다.custom_message변수에 담긴 메시지가 오류 메시지로 사용자에게 전달됩니다.
3단계: 트리거 동작 확인
이제 INSERT 명령을 사용하여 테이블에 레코드를 삽입하고 트리거가 정상적으로 작동하는지 확인해 보겠습니다.
mysql> insert into DemoTable1919 values(10);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1919 values(20);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1919 values(30);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1919 values(40);
ERROR 1644 (13500): cannot insert because sum(Value) is greater than 60
실행 결과를 보면, 처음 세 개의 레코드(10, 20, 30)는 합계가 60이 되기 전까지 정상적으로 삽입되었습니다. 하지만 네 번째 레코드(40)를 삽입하려고 하면 합계가 이미 60이므로 트리거가 작동하여 다음과 같은 오류와 함께 삽입이 차단된 것을 확인할 수 있습니다.
ERROR 1644 (13500): cannot insert because sum(Value) is greater than 60
정리
이처럼 BEFORE INSERT 트리거를 활용하면 데이터가 실제로 저장되기 전에 비즈니스 규칙을 강제로 적용할 수 있습니다. 합계 제한 외에도 필수 값 검증, 범위 체크, 중복 방지 등 다양한 용도로 활용할 수 있으므로, 데이터 무결성을 보장해야 하는 상황에서 적극적으로 사용해 보시기 바랍니다.