Review_count Trigger 만들어보기
테이블의 구조는 위와 같다. 사용자가 resaturant_review 테이블에 Insert, delete 할 때 Restaurant 테이블에 있는 review_count를 증감시키는 과정이 필요했다. (like도 동일하다)
해당방식을 Backend 단에서 따로 처리를 해줄 수 있겠지만 속도면에서 MySQL에서 직접 처리하는 것이 더 빠르며, 자동으로 처리 되기때문에 무결성 측면에서도 더 좋은 방식이다.
restaurant_review Insert 업데이트
-- restaurant_review insert시 업데이트
DELIMITER //
CREATE TRIGGER insert_restaurant_review_count
AFTER INSERT -- INSERT시 작동
ON restaurant_review -- restaurant_review 테이블에
FOR EACH ROW -- 각 row(행)마다 적용
BEGIN
UPDATE restaurant
SET review_count = (
SELECT COUNT(*)
FROM restaurant_review
WHERE restaurant_id = NEW.restaurant_id
)
WHERE id = NEW.restaurant_id;
END
//DELIMITER ;
restaurant_review Delete 업데이트
-- Restaurant_review delete시 업데이트
DELIMITER //
CREATE TRIGGER delete_restaurant_review_count
AFTER DELETE
ON restaurant_review -- restaurant_review 테이블에
FOR EACH ROW -- 각 row(행)마다 적용
BEGIN
UPDATE restaurant
SET review_count = (
SELECT COUNT(*)
FROM restaurant_review
WHERE restaurant_id = OLD.restaurant_id
)
WHERE id = OLD.restaurant_id;
END
//DELIMITER ;
restaurant_like Insert업데이트
-- restaurant_like insert시 업데이트
DELIMITER //
CREATE TRIGGER insert_restaurant_like_count
AFTER INSERT -- INSERT시 작동
ON restaurant_like -- restaurant_review 테이블에
FOR EACH ROW -- 각 row(행)마다 적용
BEGIN
UPDATE restaurant
SET like_count = (
SELECT COUNT(*)
FROM restaurant_like
WHERE restaurant_id = NEW.restaurant_id
)
WHERE id = NEW.restaurant_id;
END
//DELIMITER ;
restaurant_like Delete 업데이트
-- Restaurant_like delete시 업데이트
DELIMITER //
CREATE TRIGGER delete_restaurant_like_count
AFTER DELETE
ON restaurant_like -- restaurant_like 테이블에
FOR EACH ROW -- 각 row(행)마다 적용
BEGIN
UPDATE restaurant
SET like_count = (
SELECT COUNT(*)
FROM restaurant_like
WHERE restaurant_id = OLD.restaurant_id
)
WHERE id = OLD.restaurant_id;
END
//DELIMITER ;
위 4개의 코드로 Trigger를 사용하여 review, like 에 대한 개수처리를 자동화해줄 수 있었다.
위에서 생소할만한 명령어는 DELIMITER로 문법의 끝을 나타내는 역할을 한다. 기존 MySQL은 ; 단위로 명령어를 실행하는데, DELIMITER // 를 사용할 경우 문법의 끝을 //로 인식하게 된다.
'Back > MySQL' 카테고리의 다른 글
MySQL Event Trigger (0) | 2023.07.04 |
---|