当前位置: 首页 > news >正文

如何简洁高效的实现存在则更新,不存在则插入

在实际业务场景中,存在则更新,不存在则插入的场景很常见,如日统计、年统计、金额累计等,通常的做法是先查询,再根据查询结果选择插入还是更新,今天介绍MySql中的一种特殊语法,ON DUPLICATE KEY UPDATE

基本结构

INSERT INTO supplier_bill_account (id, platform_id, sjid, account_type, supplier_id, supplier_type, expect_settle_amount, settle_amount, un_settle_amount, num, unreconciled_amount)
VALUES (#{id},#{platformId},#{sjid},#{accountType},#{supplierId},#{supplierType},#{expectSettleAmount},#{settleAmount},#{unSettleAmount},#{num},#{unreconciledAmount})
ON DUPLICATE KEY UPDATE num=num+VALUES(num),unreconciled_amount=unreconciled_amount+VALUES(unreconciled_amount)

ON DUPLICATE KEY UPDATE 的作用

1. 基本功能
  • 当尝试插入的数据与表中现有记录的主键或唯一键冲突时(即出现重复键错误)
  • 不执行 INSERT 操作,而是执行 UPDATE 操作,更新指定的列
2. 在这个具体语句中的行为
  • 如果表中已存在具有相同唯一键(可能是 id 或其他定义为唯一键的列组合)的记录
  • 则不会插入新记录,而是更新现有记录的:
  • num 字段:现有值加上新值 (num=num+VALUES(num))
  • unreconciled_amount 字段:现有值加上新值 (unreconciled_amount=unreconciled_amount+VALUES(unreconciled_amount))
3. VALUES() 函数
  • VALUES(num) 引用的是 INSERT 语句中原本要插入的 num 值
  • VALUES(unreconciled_amount) 同理

ON DUPLICATE KEY UPDATE 语句中,不需要显式指定 WHERE 条件,这是因为它有隐式的更新条件

隐式更新条件

1. 自动识别冲突键
  • 更新操作会自动针对导致重复键冲突的那条记录进行
  • 冲突的判断是基于表的主键(Primary Key)或唯一键(Unique Key)

在上述的例子中

INSERT INTO supplier_bill_account (id, platform_id, sjid, ...)
VALUES (#{id}, #{platformId}, #{sjid}, ...)
ON DUPLICATE KEY UPDATE ...
  • 当插入的 id 值(或其它被定义为唯一键的列组合)已存在时
  • 系统会自动找到这条已有记录进行更新
  • 不需要手动写 WHERE id=#{id} 之类的条件
2. 为什么不需要显式条件
a. 设计原理
  • 这个语法本身就是为解决"插入或更新"场景设计的
  • 数据库引擎已经知道是哪条记录导致了冲突
b. 性能优势
  • 避免了先查询再更新的两次操作
  • 保证操作的原子性(不会有并发问题)
3. 与普通UPDATE的区别
-- 普通UPDATE需要明确条件
UPDATE table SET col=val WHERE id=123;-- ON DUPLICATE KEY UPDATE不需要
INSERT INTO table(id, col) VALUES(123, val)
ON DUPLICATE KEY UPDATE col=VALUES(col);

注意事项

1. 必须有唯一键
  • 表必须定义了主键或唯一键,否则这个语法无效
  • 冲突检测依赖于这些键
2. 更新多列
  • 可以同时更新多个列,如您的例子中更新了num和unreconciled_amount
a. VALUES()函数
  • 使用VALUES(col_name)可以引用原本要插入的值
  • 这在批量操作中特别有用

这种语法实现了"如果记录存在则更新,不存在则插入"的功能,常用于:

  • 计数器累加(如本例中的 num 和 unreconciled_amount)
  • 避免先查询再决定插入或更新的两步操作
  • 保证操作的原子性

这种设计使得"存在则更新,不存在则插入"的操作变得非常简洁高效,且能避免并发问题。

http://www.lryc.cn/news/594815.html

相关文章:

  • HTML前端颜色渐变动画完整指南
  • TPS61194PWPRQ1适用于汽车照明低 EMI、高性能 4 通道 LED 驱动器TPS61194
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 主页布局实现
  • ppp实验
  • 如何在FastAPI中整合GraphQL的复杂度与限流?
  • QT跨平台应用程序开发框架(11)—— Qt系统相关
  • 了解 ReAct 框架:语言模型中推理与行动的协同
  • 论文Review Lidar 3DGS Splat-LOAM: Gaussian Splatting LiDAR Odometry and Mapping
  • 无人机浆叶安装顺序
  • 客流分析核心算法 trajectory_event_analyzer数据结构
  • 7.11.B树
  • 遇到偶现Bug(难以复现)怎么处理?
  • 数据结构:反转字符串(Reversing a String)
  • 无人机避障雷达模式运行方式
  • PHP面向对象高级特性:魔术方法、对象迭代器与设计模式应用
  • dolphinscheduler中sqoop无法执行
  • 三款适合户外探险、应急救援的智能三防手机,各有各的优势
  • SQLite以及Room框架的学习:用SQLite给新闻app加上更完善的登录注册功能
  • 深入浅出:从最小核心到完整架构,全面解析5G用户面协议栈
  • Mac上安装Claude Code的步骤
  • RANsemi 推出适用于 Split 7.2 Open RAN 无线电单元的即插即用基带板
  • Q10900H6迷你电脑:集成双10G+四2.5G网口,支持多系统网络部署
  • RNS805 是针对 O-RAN 联盟兼容 Cat A O-RU 优化的 SoC,符合 3GPP 5G/4G 标准。
  • 【Android】交叉编译faiss库 | 问题解决
  • 区块链之以太坊合约开发工具——Metamask钱包和Remix IDE
  • 部署Zabbix企业级分布式监控
  • 【Elasticsearch】settings
  • Webpack源代码泄露漏洞
  • 深圳南柯电子|发电机控制器EMC整改:从合规到高可靠的进化之路
  • Linux中ELF区域与文件偏移量的关系