当前位置:  开发笔记 > 后端 > 正文

SQLite INSERT - ON DUPLICATE KEY UPDATE(UPSERT)

如何解决《SQLiteINSERT-ONDUPLICATEKEYUPDATE(UPSERT)》经验,为你挑选了4个好方法。

MySQL有这样的东西:

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

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

    SELECT +(INSERT或UPDATE)

    更新(如果UPDATE失败,则为 + INSERT )

dan04.. 115

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> dan04..:
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.


只是为了记录,'REPLACE`不是一个选项.

2> codeholic..:

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



3> szmate1618..:

从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;



4> Jacob Thomas..:

The current answer will only work in sqlite OR mysql (depending on if you use OR or not). So, if you want cross dbms compatibility, the following will do...

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


接受的答案适用于SQLite(这是我的目标).`REPLACE`也适用于SQLite,但是在MySQL上它总会将计数器重置为0 - 而查询将是可移植的,最终结果会有很大不同.
推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有