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, ...;
工作原理
- 首先尝试执行普通的 INSERT 操作
- 如果插入成功,则正常插入数据
- 如果因为主键或唯一键冲突导致插入失败,则转而执行 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);
注意事项
- 只有当发生主键或唯一键冲突时才会触发 UPDATE
- 可以使用 VALUES(column_name) 函数引用原本要插入的值
- 如果没有指定要更新的列,则该列的值保持不变
- 此操作是原子性的,要么全部成功,要么全部失败
- 对于自增主键,即使执行 UPDATE 操作,自增计数器也会增加
实际应用场景
- 计数器更新(如文章阅读数、用户登录次数)
- 数据去重插入
- 数据同步(存在则更新,不存在则插入)
- 缓存表更新
这个功能在需要"存在则更新,不存在则插入"的场景中非常有用,可以避免先查询再决定是插入还是更新的繁琐操作。