SQLite的UPSERT – 重复密钥更新

MySQL有这样的东西:

INSERT INTO visits (ip, hits) VALUES ('127.0.0.1', 1) ON DUPLICATE KEY UPDATE hits = hits + 1; 

据我所知这个function在SQLite中不存在,我想知道的是,如果有任何方法来归档相同的效果,而不必执行两个查询。 另外,如果这是不可能的,你更喜欢什么:

  1. SELECT +(INSERT或UPDATE)
  2. 更新(+ INSERT 如果更新失败
 INSERT OR IGNORE INTO visits VALUES ($ip, 0); UPDATE visits SET hits = hits + 1 WHERE ip LIKE $ip; 

这要求“ip”列有一个UNIQUE(或PRIMARY KEY)约束。


编辑:另一个伟大的解决scheme: https : //stackoverflow.com/a/4330694/89771 。

我更喜欢UPDATE (+ INSERT if UPDATE fails) 。 更less的代码=更less的错误。

目前的答案只会在SQLite或MySQL(取决于如果您使用OR或不)。 所以,如果你想交叉dbms兼容性,下面将做…

 REPLACE INTO `visits` (ip, value) VALUES ($ip, 0); 

您应该使用memcached,因为它是存储单个值(访问次数)的单个密钥(IP地址)。 您可以使用primefaces增量函数来确保没有“种族”条件。

它比MySQL更快并且节省了负载,所以MySQL可以专注于其他事情。