前言
日常做数据库操作,最常见的需求之一就是:有就更新,没有就插入。MySQL 里这类场景通常直接用 ON DUPLICATE KEY UPDATE 处理,写法短,执行路径也比较明确。前提是表上得有主键或唯一索引,不然它根本不知道'重复'该怎么判定。
它到底做了什么
ON DUPLICATE KEY UPDATE 是 MySQL 对 INSERT 的扩展。执行插入时,如果新数据撞上了主键或唯一索引,MySQL 不会再插一条,而是转去执行 UPDATE。
语法大致是这样:
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), ...;
这个语法的触发条件很简单:插入动作违反了主键或唯一索引约束,才会走更新分支。
常见场景
计数器
文章浏览量、点赞数这类计数,基本都能套进去。
INSERT INTO article_views (article_id, view_count)
VALUES(123, 1)
ON DUPLICATE KEY UPDATE view_count = view_count + 1;
配置项
键固定、值会变的配置表,也很适合这么做。
INSERT INTO system_config (config_key, config_value, last_updated)
VALUES('site_title', 'My Website', NOW())
ON DUPLICATE KEY UPDATE config_value (config_value), last_updated NOW();


