SQLite 仅更新一条与 WHERE 子句匹配的记录,在另一个字段上使用 MAX

SQLite UPDATE only one record matching a WHERE clause, with MAX on another filed

需要修改具有类似于以下字段的 SQLite 数据库中的数据:

  hash     (string)
  modTime  (long, time in ms)
  data     (any data, e.g. string)

我知道要为其设置数据的记录的哈希值(它实际上是某个二进制 blob 的 xxHash)。可以有多个具有相同哈希值的记录,但我只需要修改具有匹配哈希值的 MAX(modTime) 值的记录...无法弄清楚如何构造 UPDATE 命令。

您可以在 WHERE 子句中使用 NOT EXISTS

UPDATE tablename
SET data = new_data
WHERE hash = ? 
AND NOT EXISTS (SELECT 1 FROM tablename t WHERE t.hash = tablename.hash AND t.modTime > tablename.modTime)

或使用列 rowid 查找您要更新的行:

UPDATE tablename
SET data = new_data
WHERE rowid = (SELECT rowid FROM tablename WHERE hash = ? ORDER BY modTime DESC LIMIT 1)

或使用 FIRST_VALUE() window 函数:

UPDATE tablename
SET data = new_data
WHERE rowid = (SELECT DISTINCT FIRST_VALUE(rowid) OVER (ORDER BY modTime DESC) FROM tablename WHERE hash = ?)

new_data替换为data的新值,将?替换为您搜索的hash的值。