TRIGGER

✒️ 2025-05-28 17:24 내용 수정


참고 자료 : MySQL Trigger Syntax and Examples, MySQL 트리거(Trigger) 개념 & 사용법, 썸머워즈's Oracle 오라클_트리거(TRIGGER)

어떤 테이블에 일어나는 이벤트를 기반으로 자동 실행되는 동작을 기술한 것

DELIMITER $
CREATE TRIGGER `트리거이름`
[BEFORE||AFTER] [INSERT||UPDATE||DELETE] ON `트리거 이벤트 대상 테이블`
[FOR EACH ROW]
BEGIN
	[조건문이나 DML]
	END $;
DELIMITER ;
DROP TRIGGER `trigger_name`;
SHOW TRIGGERS;

발동 타이밍과 이벤트


사용 예시

-- 트리거 테스트용 테이블 생성
CREATE TABLE `test` (
	`id` int,
    `name` varchar(10)
);
-- 트리거 생성 시작
DELIMITER $
CREATE TRIGGER `trigger_name`
BEFORE INSERT ON `test`
FOR EACH ROW
BEGIN
	IF (NEW.`id`%2) = 0 THEN
		SET NEW.`name` = 'even';
        ELSE 
        SET NEW.`name` = 'odd';
        END IF;
    END $;
DELIMITER ;

-- 확인을 위해 test 테이블에 id 값을 넣는다.
INSERT INTO `test` (id) VALUES (40);
INSERT INTO `test` (id) VALUES (87);

-- 결과를 확인
SELECT * FROM `test`;

trigger 1.png


서로 다른 테이블에 적용한 예시

  1. A 테이블에 데이터 추가 시 B 테이블의 데이터 수정
    • A 테이블에 “INSERT” 이벤트 발생 후(AFTER), B 테이블에 UPDATE를 한다.
    • NEW(=새로 데이터가 추가된 A 테이블 행)의 id와 같은 id를 가지는 컬럼을 대상으로 score라는 컬럼의 평균을 계산한다.
    • B 테이블의 id와 NEW 행의 id가 같은 행을 대상으로 score의 평균값을 B 테이블의 avg 컬럼에 저장한다.
    • INSERT 이벤트이므로 NEW 행의 컬럼값을 사용했다.
테이블 컬럼1 컬럼2
A id score
B id avg
DELIMITER $
DROP TRIGGER IF EXISTS `update_avg_after_insert`;

CREATE TRIGGER `update_avg_after_insert`
AFTER INSERT ON `A`
FOR EACH ROW
BEGIN 
	UPDATE `B` 
	SET 
	`avg` = (SELECT AVG(score) FROM `A` WHERE `A`.id = NEW.id)
	WHERE `B`.id = NEW.id;
END $
DELIMITER ;
  1. C 테이블에 데이터 추가 시 D 테이블의 데이터 수정
    • C 테이블에 “INSERT” 이벤트 발생 후(AFTER) D 테이블에 “UPDATE”를 한다.
    • C 테이블에 데이터가 들어오면 D 테이블에서 같은 id의 point 컬럼의 값을 1 올려주는 트리거
      • D 테이블의 id와 NEW(=이벤트가 발생한 후의 C 테이블의 행)의 id와 같은 경우에 "point = point + 1”을 수행한다.
    • INSERT 이벤트이므로 NEW 행의 컬럼값을 사용했다.
테이블 컬럼1 컬럼2
C id
D id point
DELIMITER $
DROP TRIGGER IF EXISTS `update_point`;

CREATE TRIGGER `update_point`
AFTER INSERT ON `C`
FOR EACH ROW
BEGIN 
	UPDATE `D`
	SET 
	`point` = `point` + 1
	WHERE `D`.id = NEW.id;
END $
DELIMITER ;
  1. C 테이블에 데이터 제거 시 D 테이블의 데이터 수정
    • C 테이블에 “DELETE” 이벤트 발생 후(AFTER) D 테이블에 “UPDATE”를 한다.
    • C 테이블에 데이터가 제거되면 D 테이블에서 같은 id의 point 컬럼의 값을 1 내리는 트리거
      • D 테이블의 id와 NEW(=이벤트가 발생한 후의 C 테이블의 행)의 id와 같은 경우에 "point = point - 1”을 수행한다.
    • DELETE 이벤트이므로 OLD 행의 컬럼값을 사용했다.
DELIMITER $
DROP TRIGGER IF EXISTS `update_point_down`;

CREATE TRIGGER `update_point_down`
AFTER DELETE ON `C`
FOR EACH ROW
BEGIN 
	UPDATE `D`
    SET 
    `point` = `point` - 1
    WHERE `D`.id = OLD.board_id;
END $
DELIMITER ;