on duplicate key update簡單使用

qq_26249609發表於2018-11-23

1。最近在做專案的時候,遇到這樣的一個問題,就是我每做完一件事情,都要更新一下統計表,然而要更新統計表,就要根據主鍵去統計表裡面去查詢是否已經有這樣的一條記錄,如果有那麼就更新,如果沒有那麼就插入一條記錄,開始我就是這麼幹的,結果被老大給否決了,他說可以用on duplicate key update去做。下面就實際操作一下吧:

表結構:

±----------±--------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±----------±--------±-----±----±--------±------+
| player_id | int(11) | NO | PRI | NULL | |
| count | int(11) | YES | | NULL | |
±----------±--------±-----±----±--------±------+
2 rows in set (0.01 sec)

老做法是寫三條sql語句:

select * from player_count where player_id = 1;//查詢統計表中是否有記錄

insert into player_count(player_id,count) value(1,1);//沒有記錄就執行insert 操作

update player_count set count = count+1 where player_id = 1;//有記錄就執行update操作

這種寫法比較麻煩

用on duplicate key update 的做法如下:

insert into player_count(player_id,count) value(1,1) on duplicate key update count=count+1;

這樣每次不管插入還是更新都呼叫這句語句就能達到我們要的效果,省了不少的判斷。


-- Table "push_personalize_news_statistics" DDL

CREATE TABLE `push_personalize_news_statistics` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `stat_date` date NOT NULL DEFAULT '0000-00-00' COMMENT '統計日期',
  `stat_type` tinyint(2) unsigned NOT NULL DEFAULT '0' COMMENT '統計型別 1 已審,2推薦,3不推薦 4每日進入備選池數量',
  `stat_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '當天某型別的統計資料',
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `tag_id` int(11) NOT NULL DEFAULT '0' COMMENT '標籤id',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uni_date_tag_type` (`stat_date`,`tag_id`,`stat_type`)
) ENGINE=InnoDB AUTO_INCREMENT=58 DEFAULT CHARSET=utf8mb4 COMMENT='資訊個推統計表';

新增為輸入的數字
INSERT INTO push_personalize_news_statistics (`stat_date`, `tag_id`, `stat_type`, `stat_count`) VALUES ('2018-12-12', 105226, 2, 2) ON 
               DUPLICATE KEY UPDATE `stat_count` = `stat_count` + VALUES(`stat_count`);

相關文章