본문 바로가기
  • 포르쉐타고싶다
인포테인먼트 - development/sql

[MySQL] trigger란

by 지오ㄴl 2020. 4. 15.
1. 배경

서버와 DB가 통신을 할 때, 소켓통신이 아닌 이상

서버가 요청한 쿼리문을 통해 DB가 수정된다.

 

하지만 한 테이블에 여러 테이블이 얽혀있는 경우가 있다.

예를 들어, 한 게시물에 '좋아요'를 누르면

1) 게시물 좋아요 갯수 키 값 1 증가

2) 게시물 좋아요 테이블에 {게시물 - 유저(좋아요 누른)} 데이터 추가

3) 알림 테이블에 좋아요 추가 알림 추가

.

.

.

등등 여러 테이블이 동시에 수정되는 경우가 있다.

이런 단일 상황에 정말

여러개의 쿼리를 직접 만들어야 하는걸까?

 

아니다.

 

 


2. 개념
trigger : 방아쇠
- 어떠한 상황이 발생하면 그에 따라 자동으로 수행되도록 정해놓은 프로시저

 

trigger는 위에서 설명한 것과 같이

한 테이블에 변화가 생겼을 때 그것과 연관된 다른 테이블에도 정해진 업데이트가 수행되어야 한다면

그 절차를 저장하여

 

처음 변한 한 테이블에 대한 쿼리문만 요청하면

다른 테이블을 업데이트하는 다른 쿼리문들을 따로 작성하지 않아도

자동으로 여러 업데이트가 진행되도록 한다.

 

배경에서 든 예시를 다시 보면,

trigger를 사용하면

한 유저가 게시물을 누른 것을 클라이언트가 서버에게 요청했을 때

서버가 DB에게 '좋아요 테이블에 해당 게시물-유저 관계 데이터 추가'하는 insert쿼리만 작성하면

 

1) 게시글 좋아요 수 +1

2) 알림 테이블에 추가된 좋아요 정보 추가

 

등 다른 업데이트들이

자동으로 MySQL안에서 수행된다.

 


 

3. 사용 방법

해당 절차들을 trigger로 등록을 하면 된다

 

다음은 게시글(어떤 유저가 한 Board에 좋아요를 추가했을 때

서버가 좋아요 테이블(boardLike)에 '게시글-유저'관계 데이터를 추가했을 때,

자동으로 게시글(Board)의 좋아요 갯수를 업데이트 하게 trigger를 설정한 것이다.

drop trigger if exists UpdateBoardLikeCount
DELIMITER $$
CREATE TRIGGER UpdateBoardLikeCount
after insert on boardLike for each row		// 게시글-유저 데이터 추가
BEGIN
  update board set board_like_count=board_like_count+1 
  where board_idx=new.board_idx; //자동으로 업데이트 되는 부분
  								// old, new에 주목!
                                // old는 맨 처음 쿼리로 사라진 데이터 정보
                                // new는 새로 업데이트 된 데이터 정보
END $$
DELIMITER ;

 

반응형

댓글