https://blog.csdn.net/weixin_39469127/article/details/93768427
0. 创建案例表 word_count_0626(单词计数表)
use test;
CREATE TABLE IF NOT EXISTS word_count_0626 (
id int(11) NOT NULL AUTO_INCREMENT,
word varchar(64) NOT NULL,
count int(11) DEFAULT 0,
date date NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY word (word, date) // (word,date) 两字段组合唯一
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
注:curdate() 为 "2019-06-26"
1. 执行第一次:(首次数据库表中没有数据,正常插入)
insert into word_count_0626 (word, count, date) values
('a',5,curdate())
on duplicate key update count=values(count);
# 结果显示:
id word count date
1 a 5 2019-06-26
2. 执行第二次:(与第一次的唯一(word,date)冲突,执行更新)
insert into word_count_0626 (word, count, date) values
('a',6,curdate())
on duplicate key update count=values(count);
# 结果显示:
id word count date
1 a 6 2019-06-26 (更新)
3. 执行第三次:
insert into word_count_0626 (word, count, date) values
('a',6,curdate()-1), // 取前一天,不会冲突
('a',7,curdate()) // 冲突
on duplicate key update count=values(count);
# 结果显示:
id word count date
1 a 7 2019-06-26 (更新)
3 a 6 2019-06-25 (新插入)
4. 执行第四次:(更新冲突的最后一条插入值)
insert into word_count_0626 (word, count, date) values
('a',2,curdate()), // 冲突
('a',1,curdate()) // 冲突
on duplicate key update count=values(count);
# 结果显示:
id word count date
1 a 1 2019-06-26 (更新最后一条插入值)
3 a 6 2019-06-25 (不变)
5. 执行第五次:(更新冲突的累加插入值)
insert into word_count_0626 (word, count, date) values
('a',2,curdate()),
('a',1,curdate())
on duplicate key update count=count+values(count); // 实现每行累加
# 结果显示:
id word count date
1 a 4 2019-06-26
3 a 6 2019-06-25
6. 执行第六次:(无冲突插入,观察 id 键值,出现了很多丢失,id 直接跳到了 9)
insert into word_count_0626 (word, count, date) values
('b',2,curdate())
on duplicate key update count=count+values(count);
# 结果显示:
id word count date
1 a 4 2019-06-26
3 a 6 2019-06-25
9 b 2 2019-06-26