这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战
写在前面
新来的同事可能经验尚浅,上次问我的where 1=1 是什么意思,这次又来问ON DUPLICATE KEY
首先声明,ON DUPLICATE KEY 是Mysql独有语法。是什么意思?怎么用? 我们往下看
ON DUPLICATE KEY
首先这个的出现一般伴随着UPDATE 语句。我们先来想这样一种场景,我要对数据库中的一条记录,进行新增或者修改,但是呢又不想自己去判断里面是否有,说白了 就是两次查询。通过一行sql搞定。
我们先看下面这种代码,根据用户id新增修改用户信息
//默认不是新增
boolean insert = false;
//先查询用户
User user = UserMapper.selectUserInfoById(id);
if (null == user){
//如果为空 则新建
user = new User();
insert = true;
}
user.setName(name);
user.setAge(age);
if(insert){
return userDao.insert(user);
}
return userDao.update(user)
复制代码
其实通常的做法有以下几种
1、先SELECT一下,再决定INSERT还是UPDATE;(上面展示的就是这种)
2、直接UPDATE,如果受影响行数是0,再INSERT;
3、直接INSERT,如果发生主键冲突,再UPDATE;
可能我们大多数人都是这样写的,正常逻辑,那么就在想 有没有通过一行sql就可以搞定,不需要通过java代码去查。
那么对MySQL来说其实最好的是直接利用INSERT...ON DUPLICATE KEY UPDATE...语句
INSERT INTO t_user(id,name,age) VALUES (1,'张三',25)
ON DUPLICATE KEY UPDATE name='张小三',age=30;
复制代码
到此我们的工作就完成了 ,一条sql搞定新增和修改。当有请求过来的时候。如果id为1 便不会新增,而是会直接修改相应字段
但是这里面还存在一些坑
注意点
看下面这段代码会如上所述吗
INSERT INTO t_user(name,age) VALUES ('张三',25)
ON DUPLICATE KEY UPDATE name='张小三',age=30;
复制代码
id是自增,这里我们省略赋值,那么结果会失效的,只会新增,update会失效,因为没有体现出key
原因(总结)
MySQL文档里说明:ON DUPLICATE KEY UPDATE语句判断是否冲突是依靠主键或唯一索引,因此sql当中必须体现出键,其实原理很简单嘛,mysql 不能出现相同key DUPLICATE是重复的意思,所以最终就可以理解成 当出现重复key时便修改
那么同事问了,那我不想赋值id呢,mysql文档也说了,判断是否冲突是依靠主键或唯一索引,那么我们就加唯一索引就好了,根据自己的业务情况而定,找个字段弄个唯一索引,那么就可以实现,比如我们给我们表创建唯一索引
CREATE UNIQUE INDEX IDX_NAME ON t_user(name);
复制代码
顺利实现
INSERT INTO t_user(name,age) VALUES ('张三',25)
ON DUPLICATE KEY UPDATE name='张小三',age=30;
复制代码
好,今天就到这里,我们下期再见
弦外之音
感谢你的阅读,如果你感觉学到了东西,您可以点赞,关注。也欢迎有问题我们下面评论交流
加油! 我们下期再见!
给大家分享几个我前面写的几篇骚操作