当前位置:网站首页>Mysql统计技巧:ON DUPLICATE KEY UPDATE用法
Mysql统计技巧:ON DUPLICATE KEY UPDATE用法
2022-07-05 11:23:00 【讓丄帝愛伱】
ON DUPLICATE KEY UPDATE是mysql的特殊语法,与INSERT INTO一起使用,意思就是记录存在就更新,否则就添加
INSERT INTO user(userid,username,age)
VALUES(1,'ssy',20) ON DUPLICATE KEY UPDATE age = age + 1;
执行结果分析:
- 假设未执行此语句前的记录是这样:
userid | username | age |
---|---|---|
1 | ssy | 20 |
第一种情况:
如果userid、username、age三个字段中的任何一个被设置了PRIMARY KEY或者UNIQUE,那么这条语句的效果是UPDATE。
假设userid被设成了PRIMARY KEY,那么上面的SQL相当于:
UPDATE user SET age = age + 1 WHERE userid = 1;
userid | username | age |
---|---|---|
1 | ssy | 21 |
需要注意的是: 这种情况下只认被设成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);
userid | username | age |
---|---|---|
1 | ssy | 20 |
2 | ssy | 20 |
适用场景: 统计计数
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`)
)
原数据为:
userid | username | opnum | date |
---|---|---|---|
1 | ssy | 0 | 20150424 |
如果执行了:
INSERT INTO count(username,opnum,date)
VALUES('ssy',5,'20150424') ON DUPLICATE KEY UPDATE opnum = opnum + 1;
结果为:
userid | username | opnum | date |
---|---|---|---|
1 | ssy | 1 | 20150424 |
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;
结果为:
userid | username | opnum | date |
---|---|---|---|
1 | ssy | 1 | 20150424 |
2 | ssy | 10 | 20150424 |
3 | dlm | 10 | 20150424 |
这样,如果用户ssy在2015年4月24日这一天如果有操作,就追加操作数,如果该用户今天尚无操作,则增加一条今天的操作记录。即实现了多个用户的每日统计。
边栏推荐
- Huawei equipment configures channel switching services without interruption
- Home office things community essay
- LSTM applied to MNIST dataset classification (compared with CNN)
- Question bank and answers of special operation certificate examination for main principals of hazardous chemical business units in 2022
- msfconsole命令大全,以及使用说明
- 如何将 DevSecOps 引入企业?
- SLAM 01. Modeling of human recognition Environment & path
- 基于OpenHarmony的智能金属探测器
- Solve the problem of slow access to foreign public static resources
- 如何让全彩LED显示屏更加节能环保
猜你喜欢
随机推荐
[TCP] TCP connection status JSON output on the server
COMSOL--三维随便画--扫掠
An error is reported in the process of using gbase 8C database: 80000305, host IPS long to different cluster. How to solve it?
Intelligent metal detector based on openharmony
Risc-v-qemu-virt in FreeRTOS_ Scheduling opportunity of GCC
spark调优(一):从hql转向代码
Huawei equipment configures channel switching services without interruption
Modulenotfounderror: no module named 'scratch' ultimate solution
go语言学习笔记-分析第一个程序
BOM//
Redis如何实现多可用区?
Beego cross domain problem solution - successful trial
Three paradigms of database
ZCMU--1390: 队列问题(1)
IPv6与IPv4的区别 网信办等三部推进IPv6规模部署
Lombok makes ⽤ @data and @builder's pit at the same time. Are you hit?
7.2每日学习4
无密码身份验证如何保障用户隐私安全?
四部门:从即日起至10月底开展燃气安全“百日行动”
Cron表达式(七子表达式)