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 ;
'인포테인먼트 - development > sql' 카테고리의 다른 글
[mysql] INSERT - 중복되는 데이터는 넣지 않기 (2) | 2020.04.24 |
---|---|
[mysql] procedure의 인자로 배열 전달 : FIND_IN_SET (0) | 2020.04.24 |
[MySQL] MySQL 프로파일링 - 쿼리문 성능 비교 (0) | 2020.04.10 |
[MySQL] Can't connect to local MySQL server through socket '/tmp/mysql.sock' 에러 해결 (0) | 2020.04.08 |
[MySQL] 프로시저를 사용한 cursor loop fetch 적용(sql의 for문) (0) | 2020.04.06 |
댓글