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

MySQL ON DUPLICATE KEY UPDATE 用法详解

MySQL ON DUPLICATE KEY UPDATE 用法详解

ON DUPLICATE KEY UPDATE 是 MySQL 中 INSERT 语句的一个非常有用的扩展,它允许你在插入数据时,如果遇到主键或唯一键冲突,就执行更新操作而不是报错。

基本语法

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

工作原理

  1. 首先尝试执行普通的 INSERT 操作
  2. 如果插入成功,则正常插入数据
  3. 如果因为主键或唯一键冲突导致插入失败,则转而执行 UPDATE 操作,更新指定的列

使用示例

示例1:基本用法

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

如果 id=1 的用户已存在,则更新其 name、email 并将 login_count 加1。

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

INSERT INTO products (product_id, name, stock) 
VALUES (100, 'Laptop', 10)
ON DUPLICATE KEY UPDATE stock = stock + VALUES(stock);

如果 product_id=100 的产品已存在,则将其库存增加10。

示例3:多行插入

INSERT INTO students (student_id, name, score) 
VALUES (1, 'Alice', 90),(2, 'Bob', 85),(3, 'Charlie', 92)
ON DUPLICATE KEY UPDATE name = VALUES(name), score = VALUES(score);

注意事项

  1. 只有当发生主键或唯一键冲突时才会触发 UPDATE
  2. 可以使用 VALUES(column_name) 函数引用原本要插入的值
  3. 如果没有指定要更新的列,则该列的值保持不变
  4. 此操作是原子性的,要么全部成功,要么全部失败
  5. 对于自增主键,即使执行 UPDATE 操作,自增计数器也会增加

实际应用场景

  • 计数器更新(如文章阅读数、用户登录次数)
  • 数据去重插入
  • 数据同步(存在则更新,不存在则插入)
  • 缓存表更新

这个功能在需要"存在则更新,不存在则插入"的场景中非常有用,可以避免先查询再决定是插入还是更新的繁琐操作。

http://www.dtcms.com/a/266694.html

相关文章:

  • 鸿蒙开发List长按Item拖拽切换效果
  • 基于区块链的物联网(IoT)安全通信与数据共享的典型实例
  • JSONLines和JSON数据格式使用教程
  • AI大模型:(二)1.5 Stable Diffusion中文文生图模型部署
  • 30 秒锁定黑客攻击:SLS SQL 如何从海量乱序日志中“揪”出攻击源
  • 【C语言刷题】第十天:加量加餐继续,代码题训练,融会贯通IO模式
  • 短篇小说7.4
  • BM4 合并两个排序的链表
  • QT6 源(152)模型视图架构里的表格窗体视图 QTableWidget 篇二:学习本类的 protected 权限的成员函数,以及信号与槽函数
  • c语言中的函数IV
  • MCMC:高维概率采样的“随机游走”艺术
  • pybind11 导出 C++ map 在 Python 层 get 访问慢的优化方案
  • 区块链技术核心组件及应用架构的全面解析
  • python打卡day59@浙大疏锦行
  • 车载电子电气架构 --- OEM走向开放协同与敏捷迭代
  • 数据结构:队列的顺序存储实现
  • 【Linux 系统】基础IO——Linux中对文件的理解
  • 【深度学习新浪潮】如何使用大模型等技术基于序列预测蛋白质的结构,功能和靶点?
  • 【学习笔记】Lean4基础 ing
  • 邮科千兆8光8电工业级交换机互联网的脉搏
  • 洛谷刷题8
  • 云原生Kubernetes系列 | Ingress和Egress网络策略NetworkPolicy结合案例使用详解
  • 5060Ti安装黑屏问题一解
  • 【WIP】【VLAVLM——InternVL系列】
  • Maven编译和打包插件
  • cd-agent更换cd模型(自用)
  • i18next + 原生JS 双引擎:打造前端多语言系统最佳实践
  • Android 网络请求优化全面指南
  • 韩国小说《素食者》读后感
  • C++--多态