使用MySQL的INSERT INTO ... ON DUPLICATE KEY UPDATE进行高效数据插入和更新

mysql特殊语法insert into .. on duplicate key update ..使用详解 阅读详情

使用MySQL的INSERT INTO … ON DUPLICATE KEY UPDATE进行高效数据插入和更新

在数据库管理中,经常会遇到需要在表中插入新数据,如果已存在相同的唯一键(或主键),则更新现有数据的情况。MySQL提供了一种强大而简洁的解决方案:INSERT INTO … ON DUPLICATE KEY UPDATE语句。在本篇博客中,我们将介绍如何使用这个语句进行高效的数据插入和更新操作。

什么是INSERT INTO … ON DUPLICATE KEY UPDATE语句?

INSERT INTO ... ON DUPLICATE KEY UPDATE语句是MySQL中的一种特殊的插入语句,它结合了插入和更新操作。当我们试图向表中插入新数据时,MySQL会检查表中是否已经存在具有相同唯一键(或主键)的行。如果存在相同的唯一键,则会更新现有行的数据;否则,将插入新行。

如何使用INSERT INTO … ON DUPLICATE KEY UPDATE语句?

主键更新

让我们通过一个简单的示例来说明如何使用这个语句。假设我们有一个名为users的表,它包含以下列:

  • id:主键
  • name:姓名
  • phone:电话号码
  • age:年龄
  • email:电子邮件地址

现在,我们想要将一条用户信息插入到这个表中,如果已存在相同id的用户,则更新其表字段。我们可以使用以下语句:

INSERT INTO users (id, name, phone, age, email)
VALUES (1, 'John', '13888888886', 30, 'john@example.com')
ON DUPLICATE KEY UPDATE 
name = VALUES(name), phone = VALUES(phone), age = VALUES(age), email = VALUES(email);

在这个示例中,我们尝试向users表中插入一条新数据,其id为1。如果具有相同id的行已经存在,则将更新该行的name和age字段,否则将插入新行。

批量更新数据

除了单个数据行的插入和更新,INSERT INTO … ON DUPLICATE KEY UPDATE语句还可以用于批量更新数据。假设我们有一个包含多个用户信息的列表,我们要批量插入或更新这些用户信息。我们可以使用以下语句:

INSERT INTO users (id, name, phone, age, email) VALUES
(1, 'John', '13888888886', 30, 'john@example.com'),
(2, 'Alice', '13888888887', 25, 'alice@example.com'),
(3, 'Bob', '13888888888', 35, 'bob@example.com')
ON DUPLICATE KEY UPDATE 
name = VALUES(name), phone = VALUES(phone), age = VALUES(age), email = VALUES(email);

在这个例子中,我们一次性插入了三个用户的信息。如果其中任何一个用户的id已经存在于users表中,则将更新该行的name、age和email字段,否则将插入新行。

唯一键更新

users表以手机号phone做为唯一键:添加唯一索引。

ALTER TABLE `users`
ADD UNIQUE INDEX `unique_phone` (`phone`) USING BTREE ;

现在,我们想要将一条用户信息插入到这个表中,如果已存在相同phone的用户,则更新其name,age和email字段。我们可以使用以下语句:

INSERT INTO users (id, name, phone, age, email)
VALUES (2, 'John', '13888888888', 30, 'john@example.com')
ON DUPLICATE KEY UPDATE name = VALUES(name), age = VALUES(age), email = VALUES(email);

在这个示例中,我们尝试向users表中插入一条新数据,其id为2。如果具有相同phone的行已经存在,则将更新该行的name,age和email字段,否则将插入新行。

批量更新同上。

Mybatis的XML写法

单条插入

<!-- 插入单条数据 -->
<insert id="insertOrUpdateUser" parameterType="map">
    INSERT INTO users (id, name, phone, age, email)
    VALUES (#{id}, #{name}, #{phone}, #{age}, #{email})
    ON DUPLICATE KEY UPDATE
    	name = #{name}, age = #{age}, email = #{email}
</insert>

批量插入

<!-- 批量插入数据 -->
<insert id="batchInsertOrUpdateUsers" parameterType="list">
    INSERT INTO users (id, name, phone, age, email)
    VALUES
    <foreach collection="list" item="user" separator=",">
        (#{user.id}, #{user.name}, #{user.phone}, #{user.age}, #{user.email})
    </foreach>
    ON DUPLICATE KEY UPDATE 
    	name = VALUES(name), age = VALUES(age), email = VALUES(email)
</insert>

总结

通过使用MySQL的INSERT INTO ... ON DUPLICATE KEY UPDATE语句,我们可以轻松地实现在插入数据时进行更新的功能。这个功能对于需要频繁更新数据的应用程序来说特别有用,能够提高数据库操作的效率。希望本文对您理解和使用这个功能有所帮助!

SQL中的魔法操作:INSERT ON DUPLICATE KEY UPDATE深度解析 是一个非常有用的 SQL 操作,能够在插入数据时处理重复数据,并进行更新。这在许多高并发、需要同时执行插入和更新操作的场景中非常有效。优势说明简化代码避免了手动检查数据是否存在的繁琐过程高效的数据处理在高并发环境下处理重复数据时,减少了查询和插入的开销批量处理支持批量插入与更新,适合处理大量数据。 阅读详情

相关推荐

MySQL高效数据操作:深入解析insert into ... on duplicate key update语法实战

本文深入解析MySQL中INSERT INTO ... ON DUPLICATE KEY UPDATE语法的实战应用。该语法基于唯一索引实现“存在则更新,不存在则插入”的原子操作,能有效替代传统的“先查后改”模式,提升数据操作性能与并发安全性,并简化代码逻辑。文章通过具体场景演示了其核心机制、多唯一键冲突处理、VALUES()函数使用及常见避坑指南。

weixin_29284201的博客 401

insert...on duplicate key update语法详解

一.作用和使用场景 在mysql入库时,不能出现两条数据主键一致的情况,因为在两条数据的主键一致的情况下,mysql就会判定为待插入数据在数据库中存在重复数据,也就是说判断数据是否重复是根据主键来区别的。 但是有一些场景,如日志文件解析入库,消息队列接收数据入库等情况下可能解析到或者接收到待插入的重复数据存在重复数据则更新,不存在则插入。 这时如下语句的写法就派上用场了,on dupli...

赵英超的博客 4万+

PSIM联合VS--C++实现正弦波发生

在利用VS联合PSIM仿真中,想要用VS构建一个正弦波发生模块。可以利用Sin函数进行编写,重点是需要编写一个计数器程序。首先打算用for循环语句来构建计数器,但在for循环运行时无法跳出,不能实时获得计数器的值。同理,while循环也无法实现。最后将count变量设置为static型,解决了这一问题。 体现出对于c++程序的运行不够了解,需要多进行程序的编写和调试。 //时钟计数器 static int count = 0; count++; if (count > Sinfre)

weixin_41850228的博客 1086

MySQL的insert-on-duplicate语句详解

MySQL的insert-on-duplicate语句详解

Charge8的博客 8949

动态表单设计

自定一表单数据结构。内容展示如有必要行转列。前端根据题目类型自定义组件后端跟俊题目类型用策略模式校验各种类型这样有统计功能的简单动态问卷就可以了展示时可能某些场景需要行转列。大概估摸使用的话有可能kmic_form_data_detail表的记录数比较大,后期再考虑数据或者表迁移或拆分。

zquwei的博客 3451

Rider高效调试UE引擎:无需编译源码的符号配置指南

本文提供了一份详尽的Rider高效调试UE引擎指南,核心在于无需编译源码即可配置调试符号。通过Epic启动器下载官方PDB文件,并在Rider中正确配置外部符号服务器路径,开发者能在10分钟内实现对引擎内部代码(如AActor::Tick)的源码级断点调试、变量查看和调用堆栈分析,极大提升问题排查效率。

weixin_29011239的博客 340

mysql: INSERT IGNORE 与INSERT INTO、ON DUPLICATE 区别

1.INSERT IGNORE 与INSERT INTO的区别 INSERT IGNORE 与INSERT INTO的区别就是INSERT IGNORE会忽略数据库中已经存在 的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。这样就可以保留数据库中已经存在数据,达到在间隙中插入数据的目的。 eg: insert ignore into table(na

hzraymond的专栏 4740

【Clickhouse从入门到精通】第60篇:ClickHouse生态总结与未来展望

ClickHouse系列收官总结 本文作为《ClickHouse从入门到精通》系列的第60篇收官之作,系统回顾了整个系列的知识体系。文章从基础概念到高级应用,全面梳理了ClickHouse的核心技术: 知识体系:完整回顾了60篇文章的知识图谱,包括列式存储原理、MergeTree引擎家族、分布式架构等核心内容 生态工具:详细盘点了ClickHouse的企业版工具、运维监控、数据集成和可视化方案 版本演进:分析了从21.x到24.x的主要版本特性升级 未来趋势:展望了向量化引擎、湖仓一体、AI集成等发展方向

xyghehehehe的专栏 438

ON DUPLICATE KEY UPDATE 用法与说明

用法 如果待插入的行数据将导致唯一索引或主键中的值重复,则会按照ON DUPLICATE KEY UPDATE 子句的要求更新原来的行。 官网地址说明:https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html 如上,一个最简单的SQL示例,我们大致可以分成三个部分。 第一部分:常规的INSERT语句 第二部分:子句声明,固定格式 第三部分:待更新的子句 ​ 示例说明 ...

郭大神的博客 1091

Ubuntu安装opencv4.5(自己安装过程详细)

1.下载opencv 在opencv官网下载source版,下载链接 http://opencv.org/releases.html。别下载错版本 下载过程就不多说了。 2.安装过程 2.1解压 unzip opencv-4.5.0.zip cd opencv-4.5.0 2.2安装依赖的库 sudo apt-get install cmake sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-

weixin_45629790的博客 1万+

android studio 2022打开了v1 签名但是生成的apk没有v1签名问题

我使用了Android Studio Flamingo | 2022.2.1 Patch 2版本的IDE编译了一个apk,但是apksigner查看apk的签名信息时,发现只有v2签名,没有v1签名。试着改小一下minSdkVersion 为23重新编译apk,再检测一下签名版本v1居然打开了!参考网上搜索到的方法,手动在build.gradle里面添加。但是编译出来的apk还是只有v2的签名。里面提到了v1签名还和。

hedalei的博客 465

大数据量数据,MySql批量插入时,如何不插入重复的数据?

文章目录前言一、insert ignore into二、on duplicate key update三、replace into总结 前言 Mysql插入不重复的数据,当大数据量的数据需要插入值时,要判断插入是否重复,然后再插入,那么如何提高效率?解决的办法有很多种,不同的场景解决方案也不一样,数据量很小的情况下,怎么搞都行,但是数据量很大的时候,这就不是一个简单的问题了。 一、insert ignore into 会忽略数据库中已经存在 的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就

日常分享工作中的一些技术干货。 1万+

[企业AI落地] RAG 知识库系统在多租户环境下的细粒度权限隔离设计

多租户 RAG 系统真正的风险不只是搜不到,而是把不该看到的内容查出来、说出来、写回去。本文结合多客户售后知识助手场景,用元数据结构、向量检索过滤、回答策略和审计回写示例拆解租户、资源、检索、生成、审计五层权限边界。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 219

(5) MySQL INSERT插入条件判断:如果不存在则插入 || MySQL中replace into ||INSERT INTO … ON DUPLICATE KEY U...

摘要 我们经常需要进行sql的批量插入,要求:该条记录不存在则插入,存在则不插入。如果使用一条INSERT语句实现呢? ##test table: CREATE TABLE IF NOT EXISTS card ( cardno int(10) not null PRIMARY KEY, cardnum int(10) not null )engine=innodb defa

pandaj的专栏 2万+

北斗导航 | 基于LSTM-KF融合的北斗卫星定位算法研究框架

针对北斗卫星导航系统在复杂环境下存在的多路径效应、非视距传播等问题,提出一种基于长短期记忆网络(LSTM)与卡尔曼滤波(KF)的组合定位算法。通过LSTM网络建模定位误差的非线性特征,结合卡尔曼滤波实现动态噪声抑制,构建"粗定位-LSTM校正-卡尔曼滤波优化"的三级处理架构。实验表明,融合算法较传统方法定位精度提升42.7%,均方根误差降低至1.2米。

尘世冰封的专栏 920

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

mysql replace用法_Mysql中超级简洁语法replace into存在就更新,偷懒就这么简单

MySQL、软件编程、后端开发、软件开发、码农、计算机软件、IT、数据库、DBA业务场景批量新增电影内容数据,但业务上如果发现存在了你想自己更像数据,不想唯一约束异常传统办法,是想select判断出是否存在,然后if-else去insert 或update ,这些SQL必须2条,代码复杂,性能也不高。语法说明Mysql replace into用法最简单的一种用法就是直接将 "insert" 关键...

weixin_39906906的博客 944

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

oracle的merge语句和mysql的 ON DUPLICATE KEY UPDATE 的互相转换!!!

-- oracle merge into BASE_EXT_DICT t using (select LOWER(word) word from base_negative_word where isvalid = #{isvalid} ) s on (s.word = t.ext_word and t.ext_type =1 and t.isvalid = 1 ) when matched then UPDATE SET t.updatetime = S...

xuxi123456的博客 1645

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

mysql存在修改 否则添加_mysql如果数据不存在,则插入新数据,否则更新的实现方法...

mysql如果数据不存在,则插入新数据,否则更新的实现方法//如果不存在,则插入新数据$sql = "INSERT INTO {$ecs->table(‘cat_lang')} (cat_id,lang_id,cat_name,keywords,cat_desc)VALUES({$cat_id},{$k},'{$val['cat_name']}','{$val['keywords']}','...

weixin_30357183的博客 1008

mysql 更新 否则 添加_mysql如果数据不存在,则插入新数据,否则更新的实现方法...

mysql如果数据不存在,则插入新数据,否则更新的实现方法//如果不存在,则插入新数据$sql = "INSERT INTO {$ecs->table(‘cat_lang')} (cat_id,lang_id,cat_name,keywords,cat_desc)VALUES({$cat_id},{$k},'{$val['cat_name']}','{$val['keywords']}','...

weixin_35051558的博客 476

批量插入时,需要校验该值是否存在在插入

废话不多说,直接上解决方案 INSERT IGNORE INTO IGNORE是MySQL相对于标准SQL的扩展。如果在新表中有重复关键字,此种方法效率比较高,判断是否存在,存在会丢弃掉这行数据,不做任何插入,否则插入。当插入数据时,如出现错误时,如重复数据,将不返回错误,只以警告形式返回。所以使用ignore请确保语句本身没有问题,否则也会被忽略掉。这样不用校验是否存在了,有则忽略,无则添加...

qq_36218267的博客 3020

mysql如果数据不存在,则插入新数据,否则更新的实现方法

mysql如果数据不存在,则插入新数据,否则更新的实现方法 //如果不存在,则插入新数据 $sql = "INSERT INTO {$ecs-&gt;table(‘cat_lang')} (cat_id,lang_id,cat_name,keywords,cat_desc) VALUES({$cat_id},{$k},'{$val['cat_name']}','{$val['keywords']}...

weixin_33991727的博客 347

【Mysql】实现merge into 2

前面写过一篇相关的用replace into实现的文章, (http://blog.csdn.net/asktommorow/article/details/53857136)但replace into有个缺点,会覆盖相应的数据,今天看到了一个新方法,测了一下。 -----------------------INSERT INTO ON DUPLICATE KEY UPDATE drop ta

Ask Self,Ask Tomorrow 1256

mysql upsert 用法(批量保存或更新)

ON DUPLICATE KEY UPDATE是MySQL中INSERT语句的扩展功能,用于处理主键或唯一键冲突时执行更新操作而非报错。基本语法是在INSERT后添加更新子句,当冲突发生时更新指定列而非插入。该功能支持单行或多行操作,可使用VALUES()函数引用原插入值,具有原子性特点。典型应用场景包括计数器更新、数据去重、同步和缓存表维护等。示例演示了基本用法、条件更新以及返回结果分析(插入返回1,更新返回2,无变化返回0)。注意事项包括仅主键/唯一键冲突触发、自增ID计数器仍增长等。该功能简化了&qu

pscool的博客 554

Mysql实现不存在则插入,存在则更新

0. 数据准备 1. ON DUPLICATE KEY UPDATE insert into test_table(id,username) VALUES(4,'fukaiit') ON DUPLICATE KEY UPDATE username='fukaiit' 执行如上sql,该id不存在(此处id不存在,指的是id为X的记录不存在,包括主键、unique索引列等情况),相当于执行了in...

WWF_HelloWorld 3082

随笔:数据库存在update,不存在insert

有表:sys_config, 字段:id、config_key、config_value SqlServer:(已验证) if not exists (select * from sys_config where id = '1') INSERT INTO sys_config (id,config_key,config_value) VALUES('1','A','X') else up...

cp026la的博客 1537
上一篇: easypoi动态设置列宽,解决自动设置列宽失效
下一篇: 解决GitHub和Gitee无法同时拉取代码
默 唁
博客等级 码龄7年 77粉丝 34原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值