跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
SQL

MySQL ON DUPLICATE KEY UPDATE 实现存在更新不存在插入

MySQL ON DUPLICATE KEY UPDATE 语法用于处理 Upsert 场景,即数据存在则更新、不存在则插入。当插入操作违反主键或唯一索引约束时触发更新逻辑。常见应用包括计数器累加、配置项维护及购物车数量调整。高级用法支持条件判断更新和批量操作优化。相比 REPLACE INTO 先删后插,该方式性能更优且保留主键;相比 INSERT IGNORE 冲突忽略,它能主动更新数据。使用时需确保表结构包含主键或唯一索引以触发机制。

随缘发布于 2026/3/15更新于 2026/7/2134 浏览
MySQL ON DUPLICATE KEY UPDATE 实现存在更新不存在插入

前言

在日常的数据库操作中,我们经常会遇到这样的场景:如果数据存在,就更新它;如果不存在,就插入一条新的。这种模式通常被称为 Upsert(Update + Insert)。在 MySQL 中,实现 Upsert 最优雅、最高效的方式之一就是使用 ON DUPLICATE KEY UPDATE 语法。

一、基本概念

1、什么是 ON DUPLICATE KEY UPDATE?

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

2、工作原理

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

3、基本语法

基本语法格式如下:

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), ...;

⚠️ 触发条件:只有当插入操作违反了 主键(PRIMARY KEY) 或 唯一索引(UNIQUE INDEX) 约束时,UPDATE 部分才会被执行

二、使用场景

1、计数器更新

最常见的应用场景是实现计数器功能,如文章浏览量、点赞数等

INSERT INTO article_views (article_id, view_count)
VALUES(123, 1)
 DUPLICATE KEY  view_count  view_count  ;
ON
UPDATE
=
+
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、购物车商品更新

添加商品到购物车,已存在则更新数量

INSERT INTO shopping_cart (user_id, product_id, quantity)
VALUES(123, 456, 2)
ON DUPLICATE KEY UPDATE quantity = quantity + VALUES(quantity), added_at = CURRENT_TIMESTAMP;

⚠️ 注意:必须添加主键或唯一索引,否则 ON DUPLICATE KEY UPDATE 将不会触发,语句会正常执行插入操作(如果无其他错误)

三、高级用法

1、条件更新

在 ON DUPLICATE KEY UPDATE 子句中使用条件表达式

-- 这个例子只在新的价格更低时才更新价格
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、多表关联

虽然不能直接在 ON DUPLICATE KEY UPDATE 中使用多表,但可以结合子查询

INSERT INTO user_stats (user_id, login_count)
SELECT 123, 1 FROM dual WHERE NOT EXISTS(SELECT 1 FROM users WHERE id = 123)
ON DUPLICATE KEY UPDATE login_count = login_count + 1;

3、批量操作优化

对于大量数据的批量插入/更新,考虑以下优化

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);

⚠️ 注意:当表有多个唯一约束时,任何唯一键冲突都会触发 UPDATE

四、其他处理冲突的方案

1、REPLACE INTO

实际上是先 DELETE 再 INSERT,主键会有变化

REPLACE INTO users (email, name, login_count)
VALUES('[email protected]', 'Test User', 1);

2、INSERT IGNORE

冲突时直接忽略,不更新

INSERT IGNORE INTO users (email, name)
VALUES('[email protected]', 'Test User');

目录

  1. 前言
  2. 一、基本概念
  3. 1、什么是 ON DUPLICATE KEY UPDATE?
  4. 2、工作原理
  5. 3、基本语法
  6. 二、使用场景
  7. 1、计数器更新
  8. 2、配置项更新
  9. 3、购物车商品更新
  10. 三、高级用法
  11. 1、条件更新
  12. 2、多表关联
  13. 3、批量操作优化
  14. 四、其他处理冲突的方案
  15. 1、REPLACE INTO
  16. 2、INSERT IGNORE
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 腿式机器人 IMU 融合与状态估计实战(二)
  • Microi 吾码低代码平台核心功能解析
  • C++ map 与 multimap 底层原理及常用操作详解
  • 基于无人机的多模态目标检测:高多样性基准与基线方法
  • Java @Async 注解实现异步数据采集实战
  • NASA 火星任务软件测试:利用 AIGC 模拟极端环境攻击
  • AI 行业周报:GTC 万亿美元硬件、OpenAI 收购 Astral 与 Agent 时代来临
  • ezdxf 库 Python CAD 自动化开发指南
  • Android Studio Kotlin 开发安卓 WebView 应用及按键交互
  • [AI工具箱] Vheer:免费、免登录,一键解锁AI绘画、视频生成和智能编辑
  • C++ 性能分析工具全景与选型指南
  • 零基础学习网络安全指南:职业方向与技能路径
  • C++ STL 常用算法详解:序列、排序与数值处理
  • Web3 入门:从比特币到以太坊智能合约
  • WebView2 运行库快速部署与开发调试指南
  • 基于 SpringBoot 和 Vue 的民宿房源预订系统设计
  • Cursor、Windsurf、Kiro、Zed、VS Code 等 AI 编程工具定价对比
  • Python 字典子类:优雅扩展字典功能的实践
  • Web 安全实战:Robots.txt 协议原理、利用与防御
  • 2025 年 12 月 GESP C++ 二级真题解析

相关免费在线工具

  • SQL 美化和格式化

    在线格式化和美化您的 SQL 查询(它支持各种 SQL 方言)。 在线工具,SQL 美化和格式化在线工具,online

  • SQL转CSV/JSON/XML

    解析 INSERT 等受限 SQL,导出为 CSV、JSON、XML、YAML、HTML 表格(见页内语法说明)。 在线工具,SQL转CSV/JSON/XML在线工具,online

  • CSV 工具包

    CSV 与 JSON/XML/HTML/TSV/SQL 等互转,单页多 Tab。 在线工具,CSV 工具包在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online