티스토리 뷰
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(
로서 INSERT ... UPDATE를 진행할 수 있다.expr
)
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 |