MySQL有这样的东西:
INSERT INTO visits (ip, hits)
VALUES ('127.0.0.1', 1)
ON DUPLICATE KEY UPDATE hits = hits + 1;
据我所知,SQLite中不存在此功能,我想知道的是,如果有任何方法可以实现相同的效果,而无需执行两个查询。此外,如果无法做到这一点,您更喜欢什么:
答案 0 :(得分:113)
INSERT OR IGNORE INTO visits VALUES ($ip, 0);
UPDATE visits SET hits = hits + 1 WHERE ip LIKE $ip;
这要求“ip”列具有UNIQUE(或PRIMARY KEY)约束。
编辑:另一个很好的解决方案:https://stackoverflow.com/a/4330694/89771。
答案 1 :(得分:18)
我更喜欢UPDATE (+ INSERT if UPDATE fails)
。更少的代码=更少的错误。
答案 2 :(得分:11)
Since 3.24.0 SQLite also supports upsert,所以现在您只需编写以下内容
INSERT INTO visits (ip, hits)
VALUES ('127.0.0.1', 1)
ON CONFLICT(ip) DO UPDATE SET hits = hits + 1;
答案 3 :(得分:6)
目前的答案只适用于sqlite或mysql(取决于你是否使用OR)。因此,如果您想要交叉dbms兼容性,以下将执行...
REPLACE INTO `visits` (ip, value) VALUES ($ip, 0);
答案 4 :(得分:-3)
您应该使用memcached,因为它是存储单个值(访问次数)的单个密钥(IP地址)。您可以使用原子增量函数来确保没有“竞争”条件。
它比MySQL更快并且节省了负载,因此MySQL可以专注于其他事情。