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;
값이 중복되는지를 판단하는 조건은 당연히 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 하려면 아래 포스팅 참고.
'코딩 > SQL_Query' 카테고리의 다른 글
[MySQL] 초성 검색 함수 생성, 활용 (2) | 2022.10.04 |
---|---|
mysql - 여러 행(row)의 데이터를 한 줄로 출력 (0) | 2022.09.28 |
[MySQL] UPDATE 쿼리 WHERE 절 서브쿼리 문제 (0) | 2015.01.22 |
[MySQL] REPLACE 문자열 치환하기, SUBSTRING_INDEX 문자열 자르기 (0) | 2014.09.18 |
[MySQL] SELECT 결과에 행 번호 자동으로 매기기 (0) | 2014.02.27 |