前言
在日常的数据库操作中,我们经常会遇到这样的场景:如果数据存在,就更新它;如果不存在,就插入一条新的。这种模式通常被称为 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、工作原理
- 尝试插入:MySQL 首先尝试按照正常的 INSERT 语句插入新记录
- 检查冲突:在插入前,MySQL 会检查是否存在与待插入数据主键或唯一索引冲突的记录
- 冲突处理:
- 如果没有冲突:正常插入新记录
- 如果有冲突:不插入新记录,而是根据
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 ;


