新来的同事问我 ON DUPLICATE KEY 是什么意思

这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战

写在前面

新来的同事可能经验尚浅,上次问我的where 1=1 是什么意思,这次又来问ON DUPLICATE KEY

上一篇:新来的同事问我where 1=1 是什么意思

首先声明,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;
复制代码

好,今天就到这里,我们下期再见

弦外之音

感谢你的阅读,如果你感觉学到了东西,您可以点赞,关注。也欢迎有问题我们下面评论交流

加油! 我们下期再见!

给大家分享几个我前面写的几篇骚操作

copy对象,这个操作有点骚!

干货!SpringBoot利用监听事件,实现异步操作

おすすめ

転載: juejin.im/post/7031566853981863944