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

SQLite实现INSERT时无需更新即可始终返回id的查询方案

解决方案

可以使用SQLite的公共表表达式(CTE)结合INSERT ... ON CONFLICT DO NOTHING和UNION ALL来实现一次语句完成需求,避免不必要的更新操作,同时直接返回对应id:

WITH inserted AS (
    INSERT INTO table_00(value) VALUES ('<some_value>')
    ON CONFLICT(value) DO NOTHING
    RETURNING id
)
SELECT id FROM inserted
UNION ALL
SELECT id FROM table_00 WHERE value = '<some_value>'
LIMIT 1;

逻辑说明

  • 首先通过WITH定义的inserted子句尝试插入目标值,当value存在冲突时不执行任何更新操作,仅返回插入成功的行的id
  • 如果插入失败(即值已存在),inserted子句不会返回结果,此时通过UNION ALL拼接查询已存在值对应的id
  • LIMIT 1确保最终只会返回一个唯一的id结果

这个方案相比你原来的语句,完全避免了无意义的行更新操作,减少了事务开销和IO消耗,同时不需要拆分两次执行语句,一次就能拿到需要的id。

内容的提问来源于stack exchange,提问作者carce-bo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 13:42:40