mysql中on duplicate key update的用法及说明

 更新时间:2025年12月22日 09:46:23   作者:VulgarOrLonely  
文章介绍了在日常开发中,使用MySQL的`ON DUPLICATE KEY UPDATE`语句来实现存在即更新,不存在则新增的功能,通过基础使用语法、批量插入、Mybatis中的写法以及情景模拟,详细展示了该语句的使用方法和优势

1、应用场景

日常开发中,对于一个数据想做到存在即更新,不存在则新增,通常的做法是先查询数据库中是否存在对应的数据,如果存在就使用更新的方法,不存在就使用新增的方法

如果是单个数据,倒也没什么问题,但如果是批量数据的话,会消耗大量的资源来进行查询操作,这样就得不偿失了。

这种情况我们可以使用mysql提供的 on duplicate key update 来进行操作。

2、基础使用语法

2.1  假设此时我们表中没有数据

执行语句(为了展示效果使用用法2)

#用法1:使用values来获取值(推荐,因为插入多个的时候可以用)
INSERT INTO `test` ( id, name )
VALUES( 1, '晓明' ) 
ON DUPLICATE KEY UPDATE
id = VALUES(id),
name = VALUES(name)

#用法2:直接使用值
INSERT INTO `user` ( id, name )
VALUES( 1, '晓明') 
ON DUPLICATE KEY UPDATE 
id = '123',
name = 'xiaoming'

  • 执行结果

2.2 有数据后再次执行

执行相同sql语句,执行结果

这里就是关键:

我们可以看到变动为2,此时就是说明原数据进行了更新,更新内容为下面UPDATE中设置的字段值 ,id也可变化,数据库中数据如下

Q:我们再次执行一次这个语句,结果是什么样子呢?

A:自然是判断出该表中无此数据,新增一条额外的新数据

  • sql结果

验证得到结论:

其实就是会自动检测是否存在Duplicate entry,如果存在values后面的值就会自动更改,不存在则插入 

3、批量插入

  • 执行语句
INSERT INTO test(`id`,`name`,`address`)
VALUES('4','修改10','北京'),
	  ('1', '晓明',1) 
ON DUPLICATE KEY UPDATE
name=VALUES(name),address=VALUES(address);
  • sql结果

id为1和id为4的分别被修改和新增,可以同时进行两种操作类型

4、Mybatis中的写法

  • 单独插入
<insert id="insertUser" parameterType="com.test.User">
    INSERT INTO user(
    id,
    name,
    gender,
    birthday,
    address)
    VALUES
    (#{id},
    #{name},
    #{gender},
    #{birthday},
    #{address})
    ON DUPLICATE KEY UPDATE
    id = VALUES(id),
    name = VALUES(name),
    gender = VALUES(gender)
    birthday = VALUES(birthday),
    address = VALUES(address)
</insert>
  • 批量插入
<insert id="insertUser" parameterType="java.util.List">
    INSERT INTO user(
    id,
    name,
    gender,
    birthday,
    address)
    VALUES
    <foreach collection="list" item="item" index="index" separator=",">
        (#{item.id},
        #{item.name},
        #{item.gender},
        #{item.birthday},
        #{item.address})
    </foreach>
    ON DUPLICATE KEY UPDATE
    id = VALUES(id),
    name = VALUES(name),
    gender = VALUES(gender)
    birthday = VALUES(birthday),
    address = VALUES(address)
</insert>

5、情景模拟

插入失败提示如下

ERROR 1062 (23000): Duplicate entry 'value' for key 'PRIMARY'

如果数据库中已有某条数据,以下的两条语句可等同:

INSERT INTO tablename (id, data) VALUES (1, 10)
ON DUPLICATE KEY UPDATE data=data+10;
UPDATE tablename SET data=data+10 WHERE id=1;

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Mysql满意度调查分组去除最高最低求平均分的实现思路

    Mysql满意度调查分组去除最高最低求平均分的实现思路

    该文章介绍了如何使用SQL查询实现按部门分组,去除每个部门的最高分和最低分,并计算剩余分数的平均分,文章详细描述了实现这一需求的步骤,包括使用窗口函数、子查询和CTE等技术,感兴趣的朋友跟随小编一起看看吧
    2025-01-01
  • MySQL中union和unionall区别

    MySQL中union和unionall区别

    本文主要介绍了MySQL中union和unionall区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • MySQL基础教程之事务异常情况

    MySQL基础教程之事务异常情况

    事务(Transaction)是访问和更新数据库的程序执行单元;事务中可能包含一个或多个sql语句,这些语句要么都执行,要么都不执行,下面这篇文章主要给大家介绍了关于MySQL基础教程之事务异常情况的相关资料,需要的朋友可以参考下
    2022-10-10
  • MYSQL的select 学习笔记

    MYSQL的select 学习笔记

    MYSQL的select 学习笔记...
    2007-02-02
  • Navicat远程连接SQL Server并转换成MySQL步骤详解

    Navicat远程连接SQL Server并转换成MySQL步骤详解

    最近遇到一个需求是将SQL Server转换为 MySQL的格式,由于不想在本地安装 SQL Server,所以决定在远程的 Windows 服务器上安装,并在本地使用Navicat远程连接它,然而在实现过程中遇到了诸多问题,记录于此。感兴趣的朋友们下面来一起学习学习吧。
    2017-01-01
  • MySQL实现字段的自定义排序的方法

    MySQL实现字段的自定义排序的方法

    一般情况下,我们排序都是直接利用 order by 字段 asc/desc;但是如果要排序的字段数据格式并不能直接实现,或者说我们需要指定的顺序且没有什么规律,简单的order by字段就实现不了,所以本文给大家介绍了MySQL实现字段的自定义排序的方法,需要的朋友可以参考下
    2024-04-04
  • Mysql 安装失败的快速解决方法

    Mysql 安装失败的快速解决方法

    这篇文章给大家介绍了mysql 安装失败的快速解决方法包括windows下mysql安装失败的一个解决案例,本文给大家介绍的非常详细,具有参考借鉴价值,感兴趣的朋友一起看下吧
    2016-10-10
  • MySQL5创建存储过程的示例

    MySQL5创建存储过程的示例

    存储过程可以一次执行多个sql语句,所以php只连接数据库一次就能查询多个语句;不过要返回多个结果集就必须用mysqli扩展来查询,否则会提示错误can't return a result set in the given context
    2008-09-09
  • MySQL自动填充create_time和update_time的两种方式

    MySQL自动填充create_time和update_time的两种方式

    当我们创建业务表的时候 通常都需要设置create_time 和 update_time,下面这篇文章主要给大家介绍了关于MySQL自动填充createTime和updateTime的两种方式,需要的朋友可以参考下
    2022-05-05
  • MySQL比较运算符使用详解及注意事项

    MySQL比较运算符使用详解及注意事项

    这篇文章主要给大家介绍了关于MySQL比较运算符使用详解及注意事项的相关资料,Mysql可以通过运算符来对表中数据进行运算,比如通过出生日期求年龄等,需要的朋友可以参考下
    2024-01-01

最新评论