Mysql on duplicate key update用法及优缺点

1️⃣ 概念

  • ON DUPLICATE KEY UPDATE 是 MySQL 提供的一种 插入或更新冲突处理语法

  • 作用:

    • 当插入记录违反 唯一索引或主键约束 时,执行 UPDATE 操作,而不是报错
  • 类似 UPSERT(插入或更新)


2️⃣ 基本语法

INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...)
ON DUPLICATE KEY UPDATE
column1 = value1, column2 = value2, ...;
  • 说明

    • table_name:表名
    • (column1, column2, ...):插入字段
    • VALUES(value1, value2, ...):对应插入值
    • ON DUPLICATE KEY UPDATE:如果主键或唯一索引冲突,则更新指定列

3️⃣ 示例

示例表

CREATE TABLE users (
``id INT PRIMARY KEY,
``username VARCHAR(50) UNIQUE,
``score INT
);

示例 1:插入或更新单条记录

INSERT INTO users (id, username, score)
VALUES (1, 'Alice', 100)
ON DUPLICATE KEY UPDATE score = 100;
  • 如果 id=1 已存在 → 更新 score=100
  • 如果不存在 → 插入新记录

示例 2:使用 VALUES() 引用插入值

INSERT INTO users (id, username, score)
VALUES (1, 'Alice', 100)
ON DUPLICATE KEY UPDATE score = VALUES(score);
  • VALUES(score):引用插入语句中的 score
  • 优点:无需手动重复写插入值,方便批量操作

示例 3:增加累加逻辑

INSERT INTO users (id, username, score)
VALUES (1, 'Alice', 10)
ON DUPLICATE KEY UPDATE score = score + VALUES(score);
  • 如果记录存在 → score 累加
  • 如果记录不存在 → 插入新记录

4️⃣ 使用场景

  1. 数据统计/计数

    • 累加访问量、点赞数、库存数量
  2. 去重插入

    • 避免重复插入已有唯一键的记录
  3. 同步数据

    • 从外部数据源更新表,已有记录更新,不存在插入

5️⃣ 优点

优点 说明
简化操作 不用先查询再决定插入或更新
支持批量 批量插入可同时处理冲突
高效 单条 SQL 原子操作,减少网络往返
灵活 可对特定字段更新或累加

6️⃣ 缺点/注意事项

缺点/注意事项 说明
仅限唯一键冲突 只有主键或唯一索引冲突才会触发
MySQL 特性 仅适用于 MySQL,不通用标准 SQL
触发器注意 更新触发器可能重复触发
大量写入性能 大批量 UPSERT 可能造成索引碎片或性能下降
VALUES() 被弃用 MySQL 8.0.19 之后推荐使用 INSERT...AS new VALUES...NEW 替代 VALUES()

7️⃣ 高级用法

  • 多字段冲突处理
INSERT INTO products (id, name, stock)
VALUES (1, 'item1', 10)
ON DUPLICATE KEY UPDATE stock = stock + VALUES(stock), name = VALUES(name);
  • 结合事务使用:保证插入/更新操作的原子性

💡 总结

  • ON DUPLICATE KEY UPDATE = 插入或更新冲突处理
  • 优点:原子性、简洁、可批量操作
  • 缺点:仅针对主键/唯一键冲突,MySQL 特有,批量高频写入需注意性能

www.52runoob.com/archives/64...

相关推荐
luckdewei1 小时前
那个用 passlib 做认证的新同事,上线第一天就把用户密码写进了日志
后端
ping某2 小时前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
JustHappy2 小时前
我汇总了身边朋友的经历才发现,其实第一份实习是最难找的......
前端·后端·面试
uhakadotcom2 小时前
在python 的 工程化架构中 ,什么是 薄包装器层?
后端·面试·github
用户1474853079747 小时前
CodeX使用Skill生成游戏美术和音乐资源,一分钟入门
后端
Melody1237 小时前
用 abort 中断 AI 流式请求,我之前做错了
后端
onething3657 小时前
Spring Boot + Spring AI 从入门到实战:7天转型计划 Day 5 —— SSE 流式输出 + 打字机效果
人工智能·后端·全栈
一个做软件开发的牛马8 小时前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解
java·后端
码事漫谈8 小时前
AI 编程的「三体」架构:OpenSpec + Superpowers + GStack 如何让一个开发者撑起整个研发团队
后端
吃饱了得干活8 小时前
深入解析 OpenFeign:从重试、拦截到负载均衡的全维度实践
后端