MySQL의 **트리거(Trigger)**는 특정 테이블에서 INSERT, UPDATE, DELETE 같은 DML 문이 실행될 때 자동으로 실행되는 객체입니다.
트리거는 실행 시점에 따라 BEFORE와 AFTER로 나눌 수 있습니다.

BEFORE 트리거
- DML 문이 실행되기 “직전”에 동작합니다.
- 실제 데이터가 테이블에 반영되기 전에 실행되므로,
👉 데이터 **검증(Validation)**이나 **값 변환(Transformation)**에 자주 사용됩니다.
예시
CREATE TRIGGER beforeUserInsert
BEFORE INSERT ON userTbl
FOR EACH ROW
BEGIN
-- 나이가 NULL이면 기본값 0으로 설정
IF NEW.age IS NULL THEN
SET NEW.age = 0;
END IF;
END;
INSERT가 실행되기 전에 NEW.age 값을 조정.
AFTER 트리거
- DML 문이 실행된 “직후”에 동작합니다.
- 실제 데이터가 테이블에 반영된 이후 실행되므로,
👉 로그 기록, 다른 테이블 업데이트, 통계 반영 등에 주로 사용됩니다.
예시
CREATE TRIGGER afterOrderInsert
AFTER INSERT ON orderTbl
FOR EACH ROW
BEGIN
-- 주문이 들어오면 주문 로그 테이블에 기록
INSERT INTO orderLog(userID, prodName, orderAmount)
VALUES(NEW.userID, NEW.prodName, NEW.orderAmount);
END;
주문이 완료된 후, 주문 로그를 남김.
NEW / OLD 가상 테이블 개념
트리거 안에서는 실제 테이블 대신 가상 테이블을 참조합니다.

예시로 UPDATE 트리거를 보면:
CREATE TRIGGER beforeUserUpdate
BEFORE UPDATE ON userTbl
FOR EACH ROW
BEGIN
-- 변경 전 값(OLD)과 변경 후 값(NEW) 비교
IF OLD.age <> NEW.age THEN
INSERT INTO userLog(userID, oldAge, newAge)
VALUES(OLD.userID, OLD.age, NEW.age);
END IF;
END;
여기서
- OLD = 변경되기 전 값 (업데이트 전 데이터가 머무르는 가상 테이블)
- NEW = 변경된 후 값 (업데이트 후 반영될 데이터가 머무르는 가상 테이블)
마찬가지로 DELETE 트리거에서는 삭제되기 전 데이터가 OLD에 담겨 있어, 삭제된 값을 로그로 남길 수 있습니다.
비교 정리

정리
- BEFORE 트리거 → 데이터가 저장되기 전에 값 검증/수정
- AFTER 트리거 → 데이터가 저장된 후 로그/연관 테이블 작업
👉 한마디로,
- BEFORE = 예방(Validation)
- AFTER = 후처리(Post-processing)
결론:
트리거를 사용할 때는 **“이 로직이 데이터 저장 전 검증인지, 저장 후 후처리인지”**를 기준으로 BEFORE와 AFTER를 나눠 사용하면 됩니다.
'컴퓨터 과학 > 데이터 베이스' 카테고리의 다른 글
| MySQL에서 조건문 사용하기: IF vs CASE (0) | 2025.08.28 |
|---|---|
| MySQL에서 SELECT ... INTO 구문 이해하기 (1) | 2025.08.28 |
| MySQL 중첩 트리거와 롤백 동작 (0) | 2025.08.23 |
| MySQL 중첩 트리거(Nested Trigger) 예제: 주문 → 재고 차감 → 배송 등록 자동화 (0) | 2025.08.23 |
| MySQL 커서는 어디서 사용할 수 있을까? (1) | 2025.08.23 |