logo

English

이곳의 프로그래밍관련 정보와 소스는 마음대로 활용하셔도 좋습니다. 다만 쓰시기 전에 통보 정도는 해주시는 것이 예의 일것 같습니다. 질문이나 오류 수정은 siseong@gmail.com 으로 주세요. 감사합니다.

SQLite 활용 팁 2 - 트리거 실전 사용하기

by digipine posted Nov 01, 2017
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print

예를들어 사용자의 로그를 저장하다보면 일자별로 카운트를 계산할 필요가 있습니다.

간단하게 날자별로 GROUP BY 하면 되지만 레코드 갯수 증가할수록 커리 속도가 느려지게 됩니다.

이럴 경우 아래와 같이 별도의 카운트 테이블을 만들고 트리거를 정의해두면 속도가 저하될 염려가 없겠지요.

로그 데이블 샘플과 트리거 소스

CREATE TABLE [USER_LOG] (
  [NO] INTEGER PRIMARY KEY AUTOINCREMENT, 
  [REGTIME] CHAR(20) NOT NULL, 
  [UID] CHAR(14) NOT NULL, 
  [CARD_TYPE] INTERGER, 
  [GRADE] INTERGER, 
  [REISSUE] INTERGER, 
  [MODE] INTERGER, 
  [MATCHING_TYPE] INTERGER, 
  [MANAGER] INTERGER, 
  [STATUS] INTERGER, 
  [AUTH] INTERGER, 
  [KEY] INTERGER);

CREATE TRIGGER [LOG_INSERT_TRIGGER]
AFTER INSERT
ON [USER_LOG]
FOR EACH ROW
BEGIN
     INSERT INTO LOG_COUNT(REGTIME) SELECT DATE(new.REGTIME) WHERE NOT EXISTS (SELECT 1 FROM LOG_COUNT WHERE REGTIME = DATE(new.REGTIME));  /*  해당일자가 카운트 데이블이 있는지 확인해서 있으면 INSERT하지 않는다.  중복 방지 */
     UPDATE LOG_COUNT SET COUNT = COUNT + 1 WHERE DATE(new.REGTIME) = REGTIME; 
END;

CREATE TRIGGER [LOG_DELETE_TRIGGER]
BEFORE DELETE
ON [USER_LOG]
FOR EACH ROW
BEGIN
     UPDATE LOG_COUNT SET COUNT = COUNT - 1 WHERE DATE(old.REGTIME) = REGTIME; 
END;

 

카운드 저장을 위한 별도의 테이블 생성

CREATE TABLE [LOG_COUNT] (
  [NO] INTEGER PRIMARY KEY AUTOINCREMENT, 
  [REGTIME] CHAR(20) NOT NULL, 
  [COUNT] INTERGER DEFAULT 0);

TAG •