시나리오 : 회사의 출석 시스템이 있을때, 매일 밤 12시에 전 사원의 당일 출석 데이터가 생성되도록 하고 싶다

 

1. 테이블 생성

 

TimeStamp default current_timestamp()

위와 같은 방식으로 현재 시각을 넣어줄 수 있겠지만, 그럴 경우

2021-01-15 13:58:12

위와 같이 년월일 뿐 아니라 시분초까지 저장되게 된다

 

이렇게 되니 프론트에 뿌릴때도 한번 가공해야하고.. 비교하기도 힘들고.. 여러모로 귀찮아서 더 좋은 방법을 찾아봤다

 

date default (CURRENT_DATE)

이런 방식으로 저장할 경우, 시간 정보는 없이 날짜 정보만 저장되게 된다

 

create table ATTENDANCE(
	date date DEFAULT (CURRENT_DATE),
	userId varchar(15),
	attend int default 1,
	primary key(date, userId),
	FOREIGN KEY (userId) references USER(userId)
);

위와 같이 날짜 | 계정id | 출석여부 3가지로 테이블을 구성했다

 

 

2. 이벤트 등록

 

우선 MySQL의 이벤트가 활성화 상태인지 체크해야한다

 

show variables like "event%";

위 명령어를 입력하여 확인할 수 있다

ON 이라면 활성화 된 것이다.

 

OFF라면 cnf파일이나 ini파일 내부에

event_scheduler = ON

이렇게 설정해주면 된다 (MySQL에서 바로 바꿀 경우, 재시작되면 설정이 증발한다)

 

 

그 후 매일매일 실행될 이벤트를 등록하면 된다

create event if not exists INSERTATTENDANCE # event 이름
	on schedule
		every 1 day # 매일매일
        STARTS '2021-07-02 00:05:00' # 기준이 될 시작 시간
	on completion preserve enable # 수행 후 삭제하지 않음
    DO
    insert into ATTENDANCE (`userid`) select userId from user; #실제 수행될 SQL문

다음과 같은 이벤트로, 7/2 00:05분에 시작하여 하루마다 한번씩 실행되니 매일 00시 05분에 실행되는 것이다

 

마지막 insert문이 실행되며, ATTENDANCE 테이블에 모든 userId를 넣어주며, 나머지 date와 attend 컬럼은 default값이 설정되 있으므로 매일 / 모든 user에 대해 / 기본 attend 1(결석) 의 값이 들어가게 된다

 

실제로 며칠정도 두면 다음과 같이 자동으로 데이터가 생성된걸 확인할 수 있다

 

 

+ 혹시 해당 시간이 되었는데 이벤트가 실행되지 않았다면, MySQL의 시간이 우리 시간과 맞지 않을 수 있다

 

select now();

다음 명령어로 확인 가능하다

+ Recent posts