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

ONDUPLICATEKEYUPDATE是MySQL的一种特殊语法,用于实现记录存在时更新,否则插入的功能。本文介绍了其工作原理及使用场景,特别是适用于数量统计的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

用法:

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

sql语句执行结果分析:

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

useridusernameage
1ssy20

第一种情况:

如果userid、username、age三个字段中的任何一个被设置了PRIMARY KEY或者UNIQUE,那么这条语句的效果是UPDATE。

假设userid被设成了PRIMARY KEY,那么上面的SQL相当于:

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

执行后返回被影响的行数是2,结果是:

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);

执行后返回被影响的行数是1,结果是:

useridusernameage
1ssy20
2ssy20

适用场景: 统计计数

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

比如用户操作日志统计表叫count,字段为id,username,opnum,date
其中 idPRIMARY KEYusernamedate为不重复的 UNIQUE组合,也就是说只要usernamedate这对组合不能重复。创建表语句为:

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
2ssy1020150425
3dlm1020150425

这样,如果用户ssy在2015年4月24日这一天如果有操作,就追加操作数,如果该用户今天尚无操作,则增加一条今天的操作记录。即实现了多个用户的每日统计。
当然INSERT INTO … ON DUPLICATE KEY UPDATE的使用场景还有很多,知道原理后大家就可以自行探索了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值