본문으로 바로가기

insert 하려는 값이 DB에 이미 존재하고 있다면, 아무것도 안하는게 아니라 기존 DATA 를 UPDATE 한다.

 

사용 예

  • 접속 횟수, 다운로드 횟수처럼 +1 씩 증가하는 데이터
  • ID 에 해당하는 회원이 존재한다면 email 칼럼만 갱신

 

형식

입력하려는 값이 이미 있다면(중복) ON DUPLICATE KEY 이후 구절로 업데이트한다.

INSERT INTO log_apache VALUES('', '/shop/order/list.php', '404', '230', '1', '2015-04-19')
	ON DUPLICATE KEY UPDATE
    	cnt=cnt+1;

 

 

1번 실행한 경우
2번 실행한 경우(cnt값이 1 증가)
url 필드값만 바꿔서 실행한 경우 (없던 값이므로 추가)

 

 

값이 중복되는지를 판단하는 조건은 당연히 PRIMARY / UNIQUE KEY 이다.

테이블 생성 시 지정하거나 이미 생성된 테이블이라면 ALTER 하면 된다.

 

CREATE TABLE `log_apache` (
  `idx` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `url` VARCHAR(255) NOT NULL DEFAULT '',
  `error_code` INT(3) NOT NULL DEFAULT '200',
  `size` INT(11) NOT NULL DEFAULT '0',
  `cnt` INT(11) NOT NULL DEFAULT '0',
  `logdate` DATE DEFAULT NULL,
  PRIMARY KEY (`idx`),
  UNIQUE KEY `domain` (`url`,`error_code`,`size`,`logdate`) -- 이 5개 값이 같을 수는 없음
) ENGINE=MYISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8

 

Note

아래 방법도 고민해 볼 수 있다.

  • REPLACE INTO  삭제하고 insert 하므로 중복 키 오류가 발생하지 않는다.
  • INSERT IGNORE INTO insert 시도에 중복 키 오류가 발생하면 에러 없이 무시한다(아무 일도 일어나지 않음).

 

추가로 없는 경우 삭제 DELETE 하려면 아래 포스팅 참고.