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

