새소식

Database/MySQL

[MySQL] Trigger

  • -

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 ;

 

728x90

'Database > MySQL' 카테고리의 다른 글

[MySQL] 긴 글을 search 하는 방법 : FullText Search  (0) 2023.03.24
[MySQL] index  (0) 2023.03.23
[MySQL] procedure/function 안에서만 사용 가능한 IF  (0) 2023.03.22
[MySQL] function  (0) 2023.03.22
[MySQL] 날짜&시간 데이터  (0) 2023.03.21
Contents