只有当行的时间戳更新时,SQLite / MySQL才会替换

时间:2014-07-29 09:55:54

标签: mysql sqlite

我正在研究同步引擎并遇到问题:

我需要批量插入或替换一个查询中的多个项目,但前提是该项目的时间戳“lastModified”比数据库中的当前值更新 <如果项目存在 - 如果该项目在db中尚不存在,则应该插入它。)

到目前为止,我想出的是:

REPLACE INTO tableName (id, name, lastModified) VALUES
CASE WHEN lastModified < [itemLastModified] THEN ([itemId], [itemName], [itemLastModified]), END
CASE WHEN lastModified < [itemLastModified] THEN ([itemId], [itemName], [itemLastModified]), END
CASE WHEN lastModified < [itemLastModified] THEN ([itemId], [itemName], [itemLastModified]) END

但这显然不会起作用,因为每个case语句都会搜索表中的所有行,而不是集中在当前项上。如果物品还没有存在,那么更多的事情就会发生,我猜......

有谁知道解决这个问题的好方法?

1 个答案:

答案 0 :(得分:2)

将新数据放入临时表中。然后做:

REPLACE INTO tableName (id, name, lastModified)
SELECT t1.id, t1.name, t1.lastModified
FROM tempTable t1
LEFT JOIN tableName t2 ON t1.id = t2.id AND t1.lastModified > t2.lastModified

SELECT查询将返回临时表中具有较新修改时间或原始表中没有匹配行的所有行。