Mysql统计技巧:ON DUPLICATE KEY UPDATE用法

ON DUPLICATE KEY UPDATE是mysql的特殊语法,与INSERT INTO一起使用,意思就是记录存在就更新,否则就添加

INSERT INTO user(userid,username,age) 
VALUES(1,'ssy',20) ON DUPLICATE KEY UPDATE age = age + 1;

执行结果分析:

  • 假设未执行此语句前的记录是这样:
useridusernameage
1ssy20

第一种情况
如果userid、username、age三个字段中的任何一个被设置了PRIMARY KEY或者UNIQUE,那么这条语句的效果是UPDATE。
假设userid被设成了PRIMARY KEY,那么上面的SQL相当于:

UPDATE user SET age = age + 1 WHERE userid = 1;
useridusernameage
1ssy21

需要注意的是: 这种情况下只认被设成PRIMARY KEY的userid字段和被ON DUPLICATE KEY UPDATE的age字段,语句里的其他字段都被忽略。

第二种情况
如果userid、username、age三个字段都不是PRIMARY KEY或者UNIQUE,那这条语句的效果是INSERT INTO
上面的SQL语句相当于:

INSERT INTO user(userid,username,age) VALUES(1,'ssy',20);
useridusernameage
1ssy20
2ssy20

适用场景: 统计计数

INSERT INTO … ON DUPLICATE KEY UPDATE … 的作用简单讲就是,当记录存在时更新,否则插入。这非常适用于数量统计。

比如用户操作日志统计表叫count,字段为id,username,opnum,date

  • id 为 PRIMARY KEY
  • username和date为不重复的 UNIQUE组合,也就是说只要username和date这对组合不能重复
CREATE TABLE `user`( 
	`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
	`username` VARCHAR(30) NOT NULL DEFAULT '', 
	`opnum` INT(11) NOT NULL DEFAULT '0', 
	`date` INT(11) NOT NULL DEFAULT '0', 
	UNIQUE KEY `unique` (`username`, `date`) 
)

原数据为:

useridusernameopnumdate
1ssy020150424

如果执行了:

INSERT INTO count(username,opnum,date) 
VALUES('ssy',5,'20150424') ON DUPLICATE KEY UPDATE opnum = opnum + 1;

结果为:

useridusernameopnumdate
1ssy120150424
INSERT INTO count(username,opnum,date) VALUES('ssy',10,'20150425') 
ON DUPLICATE KEY UPDATE opnum = opnum + 1; 

INSERT INTO count(username,opnum,date) 
VALUES('dlm',10,'20150425') ON DUPLICATE KEY UPDATE opnum = opnum + 1;

结果为:

useridusernameopnumdate
1ssy120150424
2ssy1020150424
3dlm1020150424

这样,如果用户ssy在2015年4月24日这一天如果有操作,就追加操作数,如果该用户今天尚无操作,则增加一条今天的操作记录。即实现了多个用户的每日统计。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

讓丄帝愛伱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值