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
相关产品推荐
相关产品推荐

