You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL如何用单条SQL语句实现不存在则插入、存在则查询?

结论

可以通过单条SQL语句实现需求,针对不同MySQL版本有两种实现方案:

方案1:MySQL 8.0.29及以上版本(支持RETURNING子句)

直接使用如下单条语句,执行后会直接返回目标记录,不存在时自动插入,存在时直接返回原有记录:

INSERT INTO Idempotent (id, createdAt)
VALUES ('hello world', '2021-09-23 12:34:56')
ON DUPLICATE KEY UPDATE id = id
RETURNING *;

原理说明:

  • ON DUPLICATE KEY UPDATE id = id是无实际数据变更的空操作,仅用于触发主键冲突时的正常执行逻辑,不会修改原有记录的任何字段,也不会产生额外的性能开销。如果担心主键赋值的兼容性问题,也可以改成ON DUPLICATE KEY UPDATE createdAt = createdAt,效果完全一致。
  • RETURNING *是MySQL 8.0.29新增的语法,会直接返回本次插入/触发冲突的行数据,不需要额外执行查询语句。

方案2:MySQL 8.0.29以下版本

低版本MySQL不支持RETURNING语法,可通过一次提交多语句的方式实现单次交互完成需求,整个逻辑原子性不受影响:

-- 先执行插入,冲突时做空更新
INSERT INTO Idempotent (id, createdAt)
VALUES ('hello world', '2021-09-23 12:34:56')
ON DUPLICATE KEY UPDATE id = id;
-- 直接查询目标记录
SELECT * FROM Idempotent WHERE id = 'hello world';

注意事项:使用该方案需要开启数据库连接的多语句执行支持,不会出现并发插入冲突问题。

原写法报错原因

你最初的写法不符合MySQL语法规则:ON DUPLICATE KEY关键字后仅允许跟随UPDATE子句,不能直接跟SELECT语句。


内容的提问来源于stack exchange,提问作者theAnonymous

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 18:27:03