107

MySQL有这样的东西:

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

据我所知,SQLite 中不存在此功能,我想知道是否有任何方法可以在无需执行两个查询的情况下达到相同的效果。此外,如果这是不可能的,你更喜欢什么:

  1. SELECT +(插入或更新)
  2. UPDATE(+ INSERT如果更新失败
4

5 回答 5

122
INSERT OR IGNORE INTO visits VALUES ($ip, 0);
UPDATE visits SET hits = hits + 1 WHERE ip LIKE $ip;

这要求“ip”列具有唯一(或主键)约束。


编辑:另一个很好的解决方案:https ://stackoverflow.com/a/4330694/89771 。

于 2010-04-27T02:30:42.023 回答
49

由于 3.24.0 SQLite 也支持 upsert,所以现在你可以简单的写如下

INSERT INTO visits (ip, hits)
VALUES ('127.0.0.1', 1)
ON CONFLICT(ip) DO UPDATE SET hits = hits + 1;
于 2018-11-01T10:23:45.963 回答
19

我宁愿UPDATE (+ INSERT if UPDATE fails). 更少的代码 = 更少的错误。

于 2010-04-26T23:21:15.683 回答
7

当前答案仅适用于 sqlite OR mysql(取决于您是否使用 OR)。所以,如果你想要跨 dbms 的兼容性,下面会做......

REPLACE INTO `visits` (ip, value) VALUES ($ip, 0);
于 2012-11-17T02:53:45.697 回答
-4

您应该为此使用 memcached,因为它是存储单个值(访问次数)的单个键(IP 地址)。您可以使用原子增量函数来确保没有“竞争”条件。

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

于 2011-10-05T15:28:15.220 回答