なんかしらアプリつくってると、そのテーブルにそのユニークキーでデータが存在ない場合はinsert処理をして、データが存在する場合はupdateしたいってときがあると思います。
ちなみにcakePHPの場合はsaveすればおkって話なんですが、cakePHP使わない場合そうすればいいのかなーっておもってたら「ON DUPLICATE KEY UPDATE」なんてのがあるじゃねーかと。
1回select count してデータとってくるとかちょーだるいっすとか思ってたんでマジ感激っす。
こんな良くあるアイテムテーブルの時に便利かと
1
2
3
4
5
6
7
8
|
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’」ってエラーがでてしまいます。
1
2
3
4
|
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文を下記のように書き換えます。
1
2
3
4
5
|
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にしとけよってのはなしな方向で・・・