반응형

출처 : http://www.s-arcana.co.jp/tech/2011/11/insert-on-duplicate-key-update.html


프라이머리 키, 유니크 키가 중복된 경우에 UPDATE를 하는 MySQL의 편리한 구문 INSERT ON DUPLICATE KEY UPDATE
그럼 사용법을 알아보자

테스트용 테이블 준비


먼저 테이블을 작성

1CREATE TABLE `duplicate` (
2  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
3  `value` varchar(255) NOT NULL,
4  `update_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATECURRENT_TIMESTAMP,
5  PRIMARY KEY (`id`)
6) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

그리고 적당히 데이타를 insert한다.

1mysql> select * from duplicate;
2+----+-------+---------------------+
3| id | value | update_at           |
4+----+-------+---------------------+
5|  1 | hoge  | 0000-00-00 00:00:00 |
6|  2 | fuga  | 0000-00-00 00:00:00 |
7|  3 | piyo  | 0000-00-00 00:00:00 |
8+----+-------+---------------------+

한행씩 처리하는 경우는 문제가 없는데...


ON DUPLICATE KEY UPDATE를 사용, 한행씩 insert하는 경우라면 이런 식으로 UPDATE하고 싶은 컬럼이랑 값을 지정한다.

1INSERT INTO duplicate (id, value) VALUES (1, 'new-value') ON DUPLICATE KEYUPDATE value = 'new-value';

하지만 이것으로 복수행을 insert할경우에 어떻게 값을 설정해야 좋을지 고민하게 된다.

해결방법을 발견!


다큐멘트를 잘 보면 이렇게 적혀진것을 발견할수 있다.

1ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

실제로 사용해 보면 이렇다.

01INSERT INTO `duplicate` (id, value) VALUES (1,'new-hoge'), (2, 'new-fuga'),(3,'new-piyo') ON DUPLICATE KEY UPDATE value=VALUES(`value`);
02 
03mysql> select * from duplicate;
04+----+----------+---------------------+
05| id | value    | update_at           |
06+----+----------+---------------------+
07|  1 | new-hoge | 2011-11-08 05:21:25 |
08|  2 | new-fuga | 2011-11-08 05:21:25 |
09|  3 | new-piyo | 2011-11-08 05:21:25 |
10+----+----------+---------------------+

한번에 갱신이 되었다.

REPLACE INTO를 사용하면 동일하게 동작하지만 REPLACE INTO는 새롭게 insert를 해버리므로
ON UPDATE CURRENT_TIMESTAMP를 사용할수 없다.


반응형

'연구개발 > MYSQL' 카테고리의 다른 글

Monitoring Script qps (query / sec)  (0) 2014.09.11
바이너리 로그로 복원 (binlog, binary log)  (0) 2014.09.01
mysql> show status  (0) 2014.08.29
설치 패키지  (0) 2014.08.29
Multi-Master Replication Manager for MySQL mmm  (0) 2014.08.28

+ Recent posts