SQLite INSERT - ON DUPLICATE KEY UPDATE(UPSERT)

时间:2010-04-26 23:10:54

标签: sql mysql database sqlite upsert

MySQL有这样的东西:

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

据我所知,SQLite中不存在此功能,我想知道的是,如果有任何方法可以实现相同的效果,而无需执行两个查询。此外,如果无法做到这一点,您更喜欢什么:

  1. SELECT +(INSERT或UPDATE)
  2. 更新(如果UPDATE失败,则为+ INSERT

5 个答案:

答案 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可以专注于其他事情。