SQLite的UPSERT – 重复密钥更新
MySQL有这样的东西:
INSERT INTO visits (ip, hits) VALUES ('127.0.0.1', 1) ON DUPLICATE KEY UPDATE hits = hits + 1;
据我所知这个function在SQLite中不存在,我想知道的是,如果有任何方法来归档相同的效果,而不必执行两个查询。 另外,如果这是不可能的,你更喜欢什么:
- SELECT +(INSERT或UPDATE)或
- 更新(+ 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可以专注于其他事情。