시나리오 : 회사의 출석 시스템이 있을때, 매일 밤 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();
다음 명령어로 확인 가능하다
'기타' 카테고리의 다른 글
[기타] 웹게임 자동 로그인 설정 (배치 파일) (0) | 2021.08.31 |
---|---|
[기타] Intellij PMD로 코드 분석하기 (1) | 2021.08.18 |
[기타] Readmd 배지 404 badge not found 발생 (0) | 2021.08.17 |
[기타] Markdown 여러명이 공유해 동시 작성하기 (0) | 2021.08.14 |
[크롬] 가려진 탭이 작동하지 않는 문제 수정 (0) | 2021.08.13 |
[JPA] Entity에서 null값으로 인해 default 설정이 반영되지 않는 경우 (0) | 2021.07.23 |
[MySQL] Incorrect column specifier for column 'xx' 오류 (0) | 2021.07.12 |