首页 > 解决方案 > SQLite:在 upsert 后获取更新的字段

问题描述

SQLite(和其他 RDBMS,如 PostgreSQL)允许您执行插入,如果存在冲突,则改为执行更新。但是,获取更新的最终值似乎很棘手。

这个答案为例:

INSERT INTO players (user_name, age)
  VALUES('steven', 32) 
  ON CONFLICT(user_name) 
  DO UPDATE SET age=excluded.age;

假设我实际上需要知道age最终设置为什么。使用 PostgreSQL,您可以说RETURNING age,在尝试使用 SQLite(至少是 3.34.0[1])做同样的事情时,这似乎是一个语法错误。如果我只是在之后立即执行读取操作,那么在我的写入完成之后和读取开始之前,另一个操作可能会突然介入并更新该行,从而将误导性结果返回给原始调用者。

  1. 是否有任何等效的语法与RETURNINGSQLite 支持按描述进行原子写入和读取?
  2. 如果没有,也许还有其他我应该遵循的模式begin transaction-write-read-commit

谢谢!


[1] 特别是 xerial/sqlite-jdbc 3.34.0。

标签: sqlite

解决方案


推荐阅读