기계는 거짓말하지 않는다

MySQL Trigger 본문

DB/MySQL

MySQL Trigger

KillinTime 2021. 7. 17. 21:31

Trigger(트리거)

DB에서의 트리거란 어떤 테이블에 대한 쿼리 문이 종료됐을 때 자동으로 실행되는 쿼리를 뜻한다.

예시 테이블

CREATE TABLE id_table (
	idx INT UNSIGNED auto_increment,
    id varchar(100) unique not null,
    exp INT NOT NULL,
    PRIMARY KEY (idx)
);

CREATE TABLE point_table (
	idx INT UNSIGNED auto_increment,
	id varchar(100) NOT NULL,
    point_amount INT NOT NULL,
    PRIMARY KEY (idx),
    FOREIGN KEY (id) REFERENCES id_table(id)
);

트리거 생성

CREATE TRIGGER 문을 사용한다.

delimiter $$
CREATE TRIGGER plusTenPercent AFTER INSERT ON point_table
FOR EACH ROW
BEGIN
    UPDATE id_table SET exp = exp + NEW.point_amount * 0.1 WHERE id = NEW.id;
END $$
delimiter ;

delimiter $$는 트리거의 시작과 끝을 나타낸다. delimiter $$의 $$문자는 임의 사용이 가능하다.

마지막 delimiter ;가 없으면 Workbench 상에서 현재 statement의 끝을 구분할 수 없다.

 

BEFORE, AFTER 키워드는 트리거 작업 시기를 나타내며 BEFORE일 경우 위 트리거에서 INSERT 전에 실행되고

AFTER일 경우 INSERT 후에 실행된다.

 

INSERT 키워드 위치에 DELETE, UPDATE 작업에 대한 트리거를 생성할 수도 있고 이는 트리거 이벤트를 나타낸다.

 

FOR EACH ROW는 트리거 본문을 정의한다. 트리거가 활성화될 때마다,

트리거 이벤트의 영향을 받는 각 행에 대해 실행한다.

위 트리거에서 point_table의 행이 삽입되면 id_table의 id와 일치하는 행의 exp를 point_table에 삽입된

point_amount의 10%만큼 더해준다.

 

BEGIN / END 구문을 사용하여 여러 명령문을 실행하는 트리거를 정의할 수 있다.

BEGIN 블록 내에서 조건문(IF / END IF) 및 루프와 같은 루틴 내에서 허용되는 다른 구문을 사용할 수도 있다.

트리거 삭제

DROP TRIGGER 키워드를 사용한다.

DROP TRIGGER plusTenPercent;

실행 결과

insert into id_table values (null, "No1", 0);
insert into id_table values (null, "No2", 0);

insert into point_table values (null, "No1", 100);
insert into point_table values (null, "No1", 200);

select * from point_table;
select * from id_table;

select * from point_table
select * from id_table

exp = 0 + 100 * 0.1 = 10

exp = 10 + 200 * 0.1 = 30

Comments