출처 : http://www.s-arcana.co.jp/tech/2011/11/insert-on-duplicate-key-update.html
프라이머리 키, 유니크 키가 중복된 경우에 UPDATE를 하는 MySQL의 편리한 구문 INSERT ON DUPLICATE KEY UPDATE
그럼 사용법을 알아보자
테스트용 테이블 준비
먼저 테이블을 작성
1 | CREATE 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 UPDATE CURRENT_TIMESTAMP , |
6 | ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 |
그리고 적당히 데이타를 insert한다.
1 | mysql> select * from duplicate; |
3 | | id | value | update_at | |
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 | |
한행씩 처리하는 경우는 문제가 없는데...
ON DUPLICATE KEY UPDATE를 사용, 한행씩 insert하는 경우라면 이런 식으로 UPDATE하고 싶은 컬럼이랑 값을 지정한다.
1 | INSERT INTO duplicate (id, value) VALUES (1, 'new-value' ) ON DUPLICATE KEY UPDATE value = 'new-value' ; |
하지만 이것으로 복수행을 insert할경우에 어떻게 값을 설정해야 좋을지 고민하게 된다.
해결방법을 발견!
다큐멘트를 잘 보면 이렇게 적혀진것을 발견할수 있다.
1 | ON DUPLICATE KEY UPDATE c= VALUES (a)+ VALUES (b); |
실제로 사용해 보면 이렇다.
01 | INSERT INTO `duplicate` (id, value) VALUES (1, 'new-hoge' ), (2, 'new-fuga' ),(3, 'new-piyo' ) ON DUPLICATE KEY UPDATE value= VALUES (`value`); |
03 | mysql> select * from duplicate; |
05 | | id | value | update_at | |
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 | |
한번에 갱신이 되었다.
REPLACE INTO를 사용하면 동일하게 동작하지만 REPLACE INTO는 새롭게 insert를 해버리므로
ON UPDATE CURRENT_TIMESTAMP를 사용할수 없다.