Trigger는 설정된 테이블에 INSERT, UPDATE, DELETE와 같은 이벤트가 발생한 경우 미리 설정된 작업이 자동으로 실행되도록 할 수 있다.
예를 들어 고객이 물건을 구매해 구매 테이블에 정보가 insert되면, 등록된 트리거가 발동해 물품 테이블을 자동으로 update 쿼리문을 실행하도록 할 수 있다.
아래 쿼리문을 실행해 다음과 같은 테이블 2개를 생성하였다.
CREATE DATABASE trigger_test;
CREATE TABLE trigger_test.product(
상품명 varchar(100),
가격 int
);
INSERT INTO trigger_test.product VALUES ("소파", 1000);
CREATE TABLE trigger_test.counter(
자료 varchar(100),
값 int
);
INSERT INTO trigger_test.counter VALUES ("상품개수", 1);
Trigger
만약 product 테이블에 새로운 상품 정보를 insert 할 때마다 UPDATE 문으로 counter 테이블을 업데이트 하는 쿼리를 매번 작성하기 번거롭다면 Trigger를 사용하면 된다.
DROP TRIGGER IF EXISTS 데이터베이스명.트리거명;
DELIMITER $$
CREATE TRIGGER 데이터베이스명.트리거명
AFTER INSERT ON 데이터베이스명.테이블명
-- AFTER UPDATE ON 데이터베이스명.테이블명
-- BEFORE DELETE ON 데이터베이스명.테이블명
FOR EACH ROW
BEGIN
실행할 코드;
END $$
DELIMITER ;
DROP TRIGGER IF EXISTS trigger_test.counter_trigger;
delimiter $$
CREATE TRIGGER trigger_test.counter_trigger
AFTER INSERT ON trigger_test.product
FOR EACH ROW
BEGIN
UPDATE trigger_test.counter SET 값 = 값 + 1 WHERE 자료 = "상품개수";
END $$
delimiter ;
Trigger를 만들어놓았다면 아래 쿼리문처럼 product 테이블에 데이터를 insert할 경우 자동으로 counter 테이블이 업데이트 된다.
INSERT INTO trigger_test.product values("가방", 2000);
NEW / OLD 변수
OLD.변수명 같은 경우는 변경 전 자료 NEW.변수명 은 변경 후 자료를 담을 수 있다.
아래처럼 사용하면 만약 변경 후 가격이 변경 전 가격보다 비싸다면 변경 후 가격을 변경 전 가격으로 설정할 수 있다.
delimiter $$
CREATE TRIGGER trigger_test.checkout
BEFORE UPDATE ON trigger_test.product
FOR EACH ROW
BEGIN
IF NEW.가격 > OLD.가격 THEN
SET NEW.가격 = OLD.가격
END IF
END $$
delimiter ;