MySQL ON DUPLICATE KEY UPDATE 优雅解决存在更新/不存在插入难题

收藏夹吃灰系列(十一):插入更新sql语句 ON DUPLICATE KEY UPDATE 使用详解 | 超级详细,建议收藏! 一:使用背景 在项目中,你可能遇到这么一种场景,由于业务需求,需要先根据某一字段值查询数据库中是否有记录,有则更新,没有则插入。 对于这种需求,我想先看看大家是怎么玩的,在想听到大家怎么实现该需求之前,我先给介绍一下,我前同事的实现逻辑,后续就是该代码被弃用,进而被优化。 基本就是如下进行逻辑并合先进行查询再进行新增或更新操作。 if not exists (select task_name from task where task_name =... 阅读详情

基本概念

ON DUPLICATE KEY UPDATE是 MySQL 特有的一种 INSERT 语句扩展,当执行 INSERT 操作时,如果插入的数据与表中已有数据的主键(PRIMARY KEY)​或唯一索引(UNIQUE INDEX)​发生冲突(即要插入的值与已有记录的主键或唯一索引值相同),则不执行插入操作,而是转而执行 UPDATE 操作,更新已存在的记录。

工作原理

1. 尝试插入​:MySQL 首先尝试按照正常的 INSERT 语句插入新记录
2. 检查冲突​:在插入前,MySQL 会检查是否存在与待插入数据主键或唯一索引冲突的记录
3. 冲突处理​:
        如果没有冲突:正常插入新记录
        如果有冲突:不插入新记录,而是根据 ON DUPLICATE KEY UPDATE子句更新已存在的记录

基本语法

基本语法格式如下:

INSERT INTO table_name (column1, column2, ..., columnN)
VALUES (value1, value2, ..., valueN)
ON DUPLICATE KEY UPDATE
    column1 = value1,
    column2 = value2,
    ...;

更常用的写法是使用 VALUES() 函数来引用原本打算插入的值:

INSERT INTO table_name (column1, column2, ..., columnN)
VALUES (value1, value2, ..., valueN)
ON DUPLICATE KEY UPDATE
    column1 = VALUES(column1),
    column2 = VALUES(column2),
    ...;

使用场景

-- 1. 计数器更新:文章浏览量累加(最简单范式)
INSERT INTO article_views (article_id, view_count)
VALUES (123, 1)                       -- 第一次插入时 view_count = 1
ON DUPLICATE KEY UPDATE
    view_count = view_count + 1;      -- 冲突则原子+1

-- 2. 配置项更新:有就改,没有就插
INSERT INTO system_config (config_key, config_value, last_updated)
VALUES ('site_title', 'My Website', NOW())
ON DUPLICATE KEY UPDATE
    config_value = VALUES(config_value),   -- 用新值覆盖旧值
    last_updated = NOW();                  -- 同时刷新时间戳

-- 3. 购物车:数量累加 + 刷新时间戳
-- ⚠️ 必须提前建立 UNIQUE(user_id, product_id)
INSERT INTO shopping_cart (user_id, product_id, quantity, added_at)
VALUES (123, 456, 2, CURRENT_TIMESTAMP)
ON DUPLICATE KEY UPDATE
    quantity = quantity + VALUES(quantity),   -- 累加而不是覆盖
    added_at = CURRENT_TIMESTAMP;             -- 更新时间

高级用法

-- 1. 条件更新:只有新价比旧价低才降价
INSERT INTO products (product_id, price, last_updated)
VALUES (101, 99.99, NOW())
ON DUPLICATE KEY UPDATE
    price = IF(VALUES(price) < price, VALUES(price), price),  -- 条件判断
    last_updated = NOW();

-- 2. 结合子查询:用户存在才插入/更新统计
INSERT INTO user_stats (user_id, login_count)
SELECT 123, 1 FROM dual
WHERE EXISTS (SELECT 1 FROM users WHERE id = 123)   -- 确保用户真实存在
ON DUPLICATE KEY UPDATE
    login_count = login_count + 1;

-- 3. 批量插入/更新:一条语句处理多行
-- ⚠️ 任何一行冲突都会触发对应 UPDATE
INSERT INTO log_entries (user_id, action, timestamp)
VALUES
    (1, 'login',    NOW()),
    (2, 'view',     NOW()),
    (3, 'purchase', NOW())
ON DUPLICATE KEY UPDATE
    action    = VALUES(action),
    timestamp = VALUES(timestamp);

其他处理冲突的方案

-- 1. REPLACE INTO:先删后插,主键会变,外键级联要小心
REPLACE INTO users (email, name, login_count)
VALUES ('test@example.com', 'Test User', 1);

-- 2. INSERT IGNORE:冲突直接忽略,不做任何更新
INSERT IGNORE INTO users (email, name)
VALUES ('test@example.com', 'Test User');

Avalonia使用CefNet 实现web-browsers(基于CentOS8 Arm64架构) 阅读详情

相关推荐

电磁流量计模拟前端电路设计与优化

模拟前端电路(AFE)是传感器信号处理的核心环节,通过放大、滤波和模数转换实现信号调理。其设计需重点考虑放大器共模抑制比(CMRR)和ADC分辨率等关键参数,在电磁流量计等工业测量应用中,AD8220仪表放大器与AD7172-2 Σ-Δ型ADC的组合能有效简化传统多级架构。现代过采样技术结合数字滤波可替代模拟滤波器,显著提升系统集成度与测量精度,这种设计方法同样适用于压力传感、生物电信号采集等需要高精度信号调理的场景。

weixin_42602241的博客 618

mysql on key update_MySql之on duplicate key update详解

在我们的日常开发中,你是否遇到过这种情景:查看某条记录是否存在,不存在的话创建一条新记录,存在的话更新某些字段。你的处理方式是不是就是按照下面这样?$result = mysql_query('select * from xxx where id = 1');$row = mysql_fetch_assoc($result);if($row){mysql_query('update ...');}...

weixin_39614561的博客 478

上交开源装甲板识别代码分析

GitHub - xinyang-go/SJTU-RM-CV-2019: 上海交通大学 RoboMaster 2019赛季 视觉代码这里着重分析主函数main.cpp与装甲板识别部分的工程文件armer文件夹。由于未完全分析,所以对于其中log.h、options.h中的函数并不清楚,在分析时会跳过这些内容。该文章重点分析的是思路,部分函数中的数学逻辑、数据处理思路这里不详细解释(没能力)所有思维导图通过 知犀知犀思维导图 - 知犀官网 (zhixi.com)原创。

qq_42104961的博客 1320

MySQL的on duplicate key update 使用说明与总结

用法总结 基本用法:on dupdate key update 语句基本功能是:当表中没有原来记录时,就插入,有的话就更新。 1,on duplicate key update 语句根据主键id或唯一键来判断当前插入是否已存在。2,记录已存在时,只会更新on duplicate key update之后指定的字段。3,如果同时传递了主键和唯一键,以主键为判断存在依据,唯一键字段内容可以被修改。4,特殊用法:参考第五、第六条。 一,构造测试数据 注意里面的唯一键 drop table if exist

2万+

探索robotics-toolbox-python:从基础安装到高级机器人运动学应用

本文详细介绍了robotics-toolbox-python工具箱,从基础安装、环境配置到机器人运动学与动力学的核心应用。通过D-H参数、URDF导入和内置模型三种方式快速构建机器人模型,并演示了正逆运动学计算、关节空间与任务空间轨迹规划以及三维可视化仿真。该工具箱极大地简化了机器人算法开发流程,是进行机器人学研究和应用实践的强大工具。

i1j2k的博客 496

UserWarning: CUDA initialization: Unexpected error from cudaGetDeviceCount()【已解决】

UserWarning: CUDA initialization: Unexpected error from cudaGetDeviceCount()【已解决】

围炉夜敲的博客 1万+

ON DUPLICATE KEY UPDATE 用法

注意:ON DUPLICATE KEY UPDATE 是Mysql特有的语法,仅Mysql有效。 作用:当执行insert操作时,有已经存在的记录,执行update操作。 用法: 有一个test表,id为主键。第一次插入数据 INSERT INTO test(id,name,age)VALUES(1,'2',3),(11,'22',33) 此时表中数据增加了一条主键’id’为‘1’和‘11’的两条记录,当我们再次执行一条id为1的插入语句时,会发生什么呢? INSERT

qq_38803590的博客 4万+

深入STM32 USB OTG FS:从官方MSC例程到实战双存储设备移植全记录

本文详细解析了STM32 USB OTG FS在双存储设备开发中的实战应用,从协议栈底层机制到SD卡/SPI Flash同步挂载的实现。通过优化SDIO接口和SPI Flash驱动,结合USB MSC类的关键实现,提供了完整的解决方案和性能优化策略,适合嵌入式开发者参考。

weixin_28366475的博客 371

mysql on key update_MySQL的on duplicate key update 使用说明与总结

一,构造测试数据注意里面的唯一键drop table if exists tbl_test;create table tbl_test(id int primary key auto_increment,name varchar(30) unique not null,age int comment '年龄',address varchar(50) comment '住址',update_time...

weixin_39847034的博客 475

域格4G网优模块获取

1、获取当前小区信息 接口说明 该命令用于获取当前小区信息。 语法结构 命令类型 格式 返回结果 Execute AT+SCELLINFO +SCELLINFO: <cellMode>,<mcc>,<mnc>,<lac>,<cellId>,<afrcn>,<cpi>,<rxLevel>

自由的幻想 2464

【电机驱动与运动控制】期末重点问题集合

问题1 梯形曲线和S形曲线各自的特点和区别,比较梯形和S形曲线位置、速度、加速度、加加速度的区别。 问题2 总惯量的计算包含哪几个部分? 哪几个部分需要进行折算? 在齿轮箱的输出侧(2号轴)总惯量需要折算到齿轮箱的输入侧(1号轴) 为什么需要折算? 齿轮箱比的存在使2号轴的转速和电机的转速不同 问题3 指出每个部分的名称。 每个部分的功能。 主磁极的励磁绕组:绝大部分直流电机都是由励磁绕组通以直流电建立主磁场; - 电枢铁心:在两个主磁极内表面之间,由硅钢片叠成的圆

【人工智障 | 计算鸡视觉 | 机器孩】 5703

MySQL中ON DUPLICATE KEY UPDATE的介绍与使用、批量更新、存在即更新不存在则插入

一、ON DUPLICATE KEY UPDATE的介绍 二、ON DUPLICATE KEY UPDATE的使用 2.1、案例一:根据主键id进行更新 2.2、案例二:根据唯一索引进行更新(常用) 2.3、案例三:没有主键或唯一键字段值相同就插入 2.4、案例四:主键与唯一键字段同时存在 三、ON DUPLICATE KEY UPDATE的注意事项 3.1、on dupdate key update之后values的使用事项 3.2、对values使用判断 3.3、唯一索引大小写敏感问题 四、ON DUP

weixin_49114503的博客 3万+

multisim14.3无法访问数据库...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 4474

告别重复数据烦恼!MySQL ON DUPLICATE KEY UPDATE 优雅解决存在更新/不存在插入难题

MySQL中的ON DUPLICATE KEY UPDATE语法提供了一种高效的"存在则更新,不存在则插入"解决方案。该语法在插入数据与主键或唯一索引冲突时,自动转为执行UPDATE操作。基本语法为在INSERT语句后添加ON DUPLICATE KEY UPDATE子句,并通过VALUES()函数引用原插入值。典型应用场景包括计数器更新、配置项维护和购物车管理等。高级用法支持条件更新、多表关联和批量操作优化。相比REPLACE INTO(先删后插)和INSERT IGNORE(忽略冲突

从基础到源码解析的学习记录 4306

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

SQL语句中的ON DUPLICATE KEY UPDATE使用详解

SQL中的ON DUPLICATE KEY UPDATE使用详解 一:主键索引,唯一索引和普通索引的关系 主键索引 主键索引是唯一索引的特殊类型。 数据库表通常有一列或列组合,其值用来唯一标识表中的每一行。该列称为表的主键。 在数据库关系图中为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的。当在查询中使用主键索引...

0bug0warning的博客 11万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ON DUPLICATE KEY UPDATE 作用及一句SQL实现批量修改

ON DUPLICATE KEY UPDATE 作用及一句SQL实现批量修改 本文学习自ON DUPLICATE KEY UPDATE 用法与说明 首先声明:ON DUPLICATE KEY UPDATE 为MySQL特有语法; 语句的作用:当insert已经存在的记录时,执行update 用法 举个栗子: table1表中有几条数据如下: 表中的主键为ID,现要插入一条数据,ID为4,nam...

qq_42269354的博客 2万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

INSERT ... ON DUPLICATE KEY UPDATE ... 批量插入与更新(存在则更新,不存在则插入)

一、前言 作为后台开发,相信大家在做业务开发时,经常会遇到这样的场景。那就是数据库没有该数据的话就做插入操作,有的话就做更新操作。 方法1:遍历集合,判断里面的对象是否存在 存在则单个update,不存在则单个insert。这样的逻辑看着貌似没问题,其实问题大着呢。要是数据量多的话,你哟一个个判断,一个个执行update或者insert操作,这样频繁操作数据库的话,性能影响超级大,直接会超时。所以...

riemann_的博客 6442

告别重复数据烦恼MySQL ON DUPLICATE KEY UPDATE 优雅解决存在更新不存在插

本文深入探讨MySQL的ON DUPLICATE KEY UPDATE语句,解决数据插入时重复键冲突的常见问题。通过实际示例和性能分析,介绍其语法、工作原理、适用场景及最佳实践,帮助开发者高效处理存在则更新、不存在则插入的业务逻辑,提升数据库操作效率和代码简洁性。

ztt123654的博客 895

MySQL:非重复插入、重复更新语句ON DUPLICATE KEY UPDATE

需求背景 在《调用ZABBIX的API获取节点主机信息小记》(传送门:https://segmentfault.com/a/11...)这篇博客中,简单阐述了如何利用zabbix-api库来获取ZABBIX监控各节点主机的信息。需要将获取的信息录入数据库,由于节点数目不断增加,因此插入数据库时,要判断节点主机是否存在,存在则更新各主机信息,不存在则插入。 实现方案 首先需要建立一张表node...

背离赤道、逆光而行 746

MySql语句中的ON DUPLICATE KEY UPDATE使用详解

有时候由于业务需求,可能需要先去根据某一字段值查询数据库中是否有记录,有则更新,没有则插入。你可能是下面这样写的else这样写在大多数情况下可以满足我们的需求,但是会有两个问题。性能带来开销,尤其是系统比较大的时候。在高并发的情况下会出现错误,可能需要利用事务保证安全。有没有一种优雅的写法来实现有则更新,没有则插入的写法呢?提供了这样的一个方式。首先我们了解下这个简单的表结构id(主键)、code、name。

liao3399084的博客 7872

【MyBatis批量插入性能飞跃】:掌握ON DUPLICATE KEY UPDATE的5大核心技巧

提升MyBatis批量插入效率?掌握ON DUPLICATE KEY UPDATE的5大技巧,解决唯一键冲突场景下的数据 Upsert 需求。涵盖SQL优化、参数映射、性能调优等核心方法,显著提升数据库写入速度与稳定性,值得收藏。

VarChat的博客 926

Mysql ON DUPLICATE KEY Update

深入理解和优雅使用ON DUPLICATE KEY Update 解决存在则更新,不存在则新增的问题 先看语法INSERT INTO table(id,a,……) values(1,‘xh’,……) ON DUPLICATE KEY Update a=‘value’,……; 举个例子 1,先创建表结构如下 DROP TABLE IF EXISTS `t_ware_duplicate`; CREA...

qq_28313291的博客 647

SQL语句中ON DUPLICATE KEY UPDATE的使用介绍

一:主键索引,唯一索引和普通索引的关系 主键索引 主键索引是唯一索引的特殊类型。 数据库表通常有一列或列组合,其值用来唯一标识表中的每一行。该列称为表的主键。 在数据库关系图中为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的。当在查询中使用主键索引时,它还允许快速访问数据。主键索引不能为空。每个表只能有一个主键 唯一索引: 不允许两行具有相同的索引值。但可以都为NULL,笔者亲试。 如果现有数据中存在重复的键值,则数据库不允许将新创建的唯一索...

专注自动化、性能测试、测试架构学习交流 1002

深度解析MySQL INSERT ... ON DUPLICATE KEY UPDATE语句

MySQL的语句是一个强大且高效的工具,特别适合需要"存在则更新,不存在则插入"的场景。如示例所示,它能简洁地处理表间数据同步,同时确保数据一致性。理解其工作原理和适用场景,可以帮助开发者编写更高效、更可靠的数据库操作代码。在实际应用中,应当根据具体业务需求、数据量和并发情况,合理选择和使用这一特性,必要时结合事务和其他SQL特性,构建完整的数据处理解决方案。

hi星尘的博客 1366

【MySql】 如何使用 MySQL 中的 ON DUPLICATE KEY UPDATE 语句

ON DUPLICATE KEY UPDATE 是一个 MySQL 语句的扩展,用于 INSERT 语句。当尝试插入的数据在表中已存在相同的唯一索引或主键时,这个语句可以指定一些更新操作,而不是让插入失败。这使得用户可以在单个查询中便捷地执行“尝试插入,如果存在则更新”的操作。

哈哈哈哈哈哈哈 929

揭秘MyBatis批量插入冲突处理:如何优雅实现ON DUPLICATE KEY UPDATE

轻松解决数据库冲突问题,详解MyBatis批量插入ON DUPLICATE KEY实现方案。适用于高并发数据写入场景,通过XML配置与SQL语句优化,兼顾性能与一致性,提升系统稳定性。值得收藏

Instrulink的博客 371
上一篇: uni-app 开发H5软键盘会顶起底部内容的解决方案
下一篇: fastadmin表格多tab选项卡组合筛选
withoutfear
博客等级 码龄13年 541粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值