티스토리 뷰

반응형


13.2.5.3 INSERT ... ON DUPLICATE KEY UPDATE Syntax

만일 ON DUPLICATE KEY UPDATE를 설정하고 INSERT를 수행하면 UNIQUE index나 PRIMARY KEY로 지정된 컬럼의 중복이 있을 시 UPDATE를 수행한다. 예를들어, UNIQUE로 선언된 a 컬럼이 1의 값을 가지고 있다면 다음의 두 문장은 동일한 명령을 수행한다:

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

UPDATE table SET c=c+1 WHERE a=1;

ON DUPLICATE KEY UPDATE는 comma로 구분된 여러절의 적용도 가능하다. ON DUPLICATE KEY UPDATE로서 행당 영향을 받는 컬럼은 새로운 행으로 삽입되며, 중복시에는 업데이트가 수행된다.

만일 b 컬럼이 unique라면, INSERT 대신 UPDATE 명령이 수행된다.

UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;

만일 a=1 OR b=2 조건에 일치하는 행이 여러개 존재한다면, 단지 하나의 행(one)만이 업데이트 된다.

일반적으로 여러개의 고유 인덱스가 있는 테이블의 절에는 ON DUPLICATE KEY UPDATE의 사용을 자제해야 한다.

당신은 INSERT ... UPDATE문의 INSERT에서 열 값을 참조하는 UPDATE 절의 VALUES(col_name)를 사용할 수 있다. 이 VALUES()는  다중행 삽입 시 특히 유용하다. 

INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
  ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

위 문장은 아래와 동일하다:

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=3;
INSERT INTO table (a,b,c) VALUES (4,5,6)
  ON DUPLICATE KEY UPDATE c=9;

AUTO_INCREMENT 컬럼을 가진 테이블에 INSERT ... UPDATE 로서 삽입을 실행하는 경우, LAST_INSERT_ID()는 AUTO_INCREMENT의 값을 리턴한다. 만일 행의 삽입을 진행하는 경우 LAST_INSERT_ID()는 의미가 없다. 그러나, 당신은 LAST_INSERT_ID(expr)로서 INSERT ... UPDATE 진행할 수 있다.

id가 AUTO_INCREMENT컬럼이라고 가정할 경우, LAST_INSERT_ID()가 의미를 가지게 하려면, 다음과 같이 행을 삽입/갱신하면 된다.

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;

당신이 ON DUPLICATE KEY UPDATE를 사용할 때엔, DELAYED는 무시된다.





반응형

'Devolopment > SQL' 카테고리의 다른 글

[MySQL] 프로세스 확인 및 Kill  (0) 2015.05.29
MySQL 5.1 C API 한글매뉴얼  (0) 2015.05.29
MySQL INSERT 성능 향상  (0) 2015.05.28
[MySQL] innoDB INSERT 속도 향상 방법  (0) 2015.05.28
auto_increment values Initialized & Reset.  (0) 2015.05.27
반응형
최근에 달린 댓글