ない場合insert、ある場合update

September 14, 2011,
tags: mysql


このエントリーをはてなブックマークに追加

なんかしらアプリつくってると、そのテーブルにそのユニークキーでデータが存在ない場合はinsert処理をして、データが存在する場合はupdateしたいってときがあると思います。

ちなみにcakePHPの場合はsaveすればおkって話なんですが、cakePHP使わない場合そうすればいいのかなーっておもってたら「ON DUPLICATE KEY UPDATE」なんてのがあるじゃねーかと。

1回select count してデータとってくるとかちょーだるいっすとか思ってたんでマジ感激っす。

こんな良くあるアイテムテーブルの時に便利かと

CREATE  TABLE IF NOT EXISTS `user_item` (
  `user_id` INT UNSIGNED NOT NULL ,
  `item_id` INT UNSIGNED NOT NULL COMMENT 'アイテムID' ,
  `amount` TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '個数' ,
  `created` DATETIME NOT NULL ,
  `modified` DATETIME NOT NULL ,
  PRIMARY KEY (`user_id` ,  `item_id`) )
ENGINE = InnoDB

user_idの人にitem_idが1のものを1個とitem_idが2のものを2個付与したいとか言う場合に下記のようなSQLをなげると「Duplicate entry ’1-2′ for key ‘PRIMARY’」ってエラーがでてしまいます。

INSERT INTO  `test`.`user_item` ( `user_id` , `item_id` , `amount` , `created` , `modified`)
VALUES ( '1',  '1',  '1',  '2011-09-14 02:42:30',  '2011-09-14 02:42:34'),
( '1',  '2',  '1',  '2011-09-14 02:42:39',  '2011-09-14 02:42:41'),
( '1',  '2',  '1',  '2011-09-14 02:42:39',  '2011-09-14 02:42:41')

そんなときに「ON DUPLICATE KEY UPDATE」の出番です。
上記のINSERT文を下記のように書き換えます。

INSERT INTO  `test`.`user_item` ( `user_id` , `item_id` , `amount` , `created` , `modified`)
VALUES ( '1',  '1',  '1',  '2011-09-14 02:42:30',  '2011-09-14 02:42:34'),
( '1',  '2',  '1',  '2011-09-14 02:42:39',  '2011-09-14 02:42:41'),
( '1',  '2',  '1',  '2011-09-14 02:42:39',  '2011-09-14 02:42:41')
ON DUPLICATE KEY UPDATE amount = amount + 1;

なんかバッチ処理とかでSQLとか投げる時に便利なんじゃないかと思います。

※最初からitem_idが2のものをinsert時にamountの値を2にしとけよってのはなしな方向で・・・

comments powered by Disqus