배송에 관한 이벤트와 장비의 데이터가 들어가있는 두 테이블이 있다.
여기서 각각 활성화 여부, 점검 필요 유무 컬럼은 다른 컬럼과 오늘의 날짜를 비교해 컬럼의 상태가 변해야 한다.
이 과정을 자동으로 처리해주기 위해서 처음에는 Generated Columns를 활용해볼 생각이었다.
delivery_event 테이블을 예로들자면
`is_active` TINYINT(1) AS (
CASE
WHEN `start_date` <= NOW() AND ( `end_date` IS NULL OR `end_date` >= NOW() )
THEN 1
ELSE 0
END
) STORED
와 같이 컬럼을 구성하였다.
하지만 이와 같이 짠다면 에러가 발생한다. 그 이유는 Generated Column에 NOW()와 같은 비결정적함수를 사용할 수 없기 때문이다. NOW()의 값이 매번 바뀌기 때문이다. 따라서 다른 방식인 이벤트를 사용하기로 했다.
시작기간, 종료기간, 마지막 점검일 컬럼 모두 일단위로 입력되어 있고, 실시간으로 반영될 필요는 없기 때문에
매일 자정에 실행되는 이벤트를 생성했다.
CREATE EVENT `update_delivery_event_is_active`
ON SCHEDULE EVERY 1 DAY
STARTS CURDATE()
DO
UPDATE delivery_event SET is_active =
CASE
WHEN CURDATE() BETWEEN start_date AND end_date
THEN 1
ELSE 0
END
이를 통해 자동으로 활성화 여부와 점검 필요 유무를 갱신할 수 있게 되었다.
'개발일지' 카테고리의 다른 글
MySQL 성능 개선 프로젝트 3 (0) | 2024.09.04 |
---|---|
MySQL 성능 개선 프로젝트 1 (0) | 2024.09.02 |
20240125 (0) | 2024.01.25 |
20240118 (0) | 2024.01.18 |
20240116 (0) | 2024.01.17 |