2015년 6월 2일 화요일

[MySQL]INSERT ... ON DUPLICATE KEY UPDATE Syntax

MySQL에서 레코드가 이미 있다면 Update를 해야하는 경우 다음의 Query를 이용하면 편하다.
INSERT INTO 테이블이름 (이름,점수)
VALUES (“홍길동”,“100”)
ON DUPLICATE KEY UPDATE
점수=100;

혹은 카운트를 계산하여야 하는 경우..
INSERT INTO 테이블이름 (이름,방문횟수)
VALUES (“홍길동”,“100”)
ON DUPLICATE KEY UPDATE
방문횟수 = 방문횟수 +1;

(중복키를 이용하는 경우이니 당연히 UNIQUE가 걸린 필드를 기준으로 삼아야 할 것이다. 위의 경우는 이름필드가 UNIQUE가 되어야 할 것이다.)



(아래는, MySQL 설명을 내맘대로 번역해봤다. 번역이 틀렸다면.... 미안하다!!)

영어원문: http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

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는 무시된다.





.

댓글 없음:

댓글 쓰기