본문 바로가기
CS 기초/Database

[MariaDB,MySQL] Trigger 사용법 / 특정 테이블 변경 시 관련 테이블 이벤트 실행

by woohyeon 2019. 11. 12.
반응형

Trigger는 지정된 테이블의 변경을 감지하여 INSERT / UPDATE / DELETE 이벤트가 일어났을 때
설정한 이벤트를 실행하도록 합니다.

예를 들어,
A테이블의 어떤 row의 name 필드의 값이 UPDATE 되면
B테이블의 name 필드도 동일하게 UPDATE 할 수 있습니다.

Trigger는 함수, 핸들러처럼 생성해놓으면 알아서 조건에 맞게 자동으로 실행됩니다.


Trigger 생성 예제

1) 할인 테이블에 할인율 필드가 업데이트 되면 상품 테이블의 할인율도 똑같이 적용하고 싶을 때

DELIMITER //

CREATE TRIGGER update_item
AFTER UPDATE ON sale_table
FOR EACH ROW
BEGIN
    IF NEW.discount_rate != OLD.discount_rate THEN
        UPDATE item_table SET discount_rate = NEW.discount_rate WHERE discount_rate = OLD.discount_rate;
    END IF;
END; //

DELIMITER ;


DELIMITER // 

: 문장 구분자를 '//'로 설정한다는 뜻입니다. 원래 명령문 또는 쿼리를 사용할 때 세미콜론 ';' 으로  구분하는데
Trigger 생성 시 IF문 등에서 ';'를 사용하려고 임시로 구분자를 //로 변경하는 것입니다.

CREATE TRIGGER update_item
: CREATE TRIGGER [트리거 이름]

AFTER UPDATE ON sale_table
: AFTER UPDATE ON [변경을 감지할 테이블]
해당 테이블에 UPADTE 이벤트가 실행된 후


FOR EACH ROW
: 아래 나올 조건에 해당하는 모든 row에 적용한다는 뜻입니다.

BEGIN
          IF 조건1 THEN
                  Query문;
          ELSE IF 조건 2 THEN
                  Query문;
          ELSE 
                  Query문;
         END IF;
END; //

: BEGIN~END 사이에 조건문과 실행문을 작성합니다.
sale_table 테이블의 변경 전/후를 기준으로 필드 앞에 변경 전은 OLD, 변경 후는 NEW 키워드가 붙습니다.
따라서 IF NEW.discount_rate != OLD.discount_rate THEN의 의미는
sale_table의 변경 후 discount_rate 필드의 값과 변경 전 discount_rate 필드의 값이 불일치한다는 조건을 의미합니다.

이 조건을 만족하는 row는 IF문 아래 작성된 UPDATE 쿼리문을 실행하게 됩니다.
IF문 또는 ELSE IF문 또는 ELSE 문 작성이 완료 되었으면 END IF로 IF문 종료를 알립니다.

이렇게 Trigger를 생성하고나면 구분자가 //로 설정되어 있기 때문에
원래대로 DELEMITER ; 명령을 통해 구분자를 복원시킵니다.

 

참고)
https://mariadb.com/kb/en/library/trigger-overview

https://www.techonthenet.com/mariadb/loops/if_then.php

'CS 기초 > Database' 카테고리의 다른 글

mariaDB 개인 메모  (0) 2019.10.22



댓글