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
的值。
需要修改具有类似于以下字段的 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
的值。