首页 > 解决方案 > 在 SQLite 中使用带有自动增量键的 upsert 时如何避免使用 key-id?

问题描述

我有一个如下表:

idPK 和自动增量。

+-----+--------+--------+
| id  |  kind  |  count |
+-----+--------+--------+

当我使用 upsert 查询时,有 100 个请求同时请求该 api。

INSERT INTO Views (kind, count)
VALUES(1, 1)
ON CONFLICT(kind)
DO UPDATE SET count = count + 1

我去拿:

+-----+--------+--------+
| id  |  kind  |  count |
+-----+--------+--------+
| 100 | kind-1 |   100  |
+-----+--------+--------+

标签: sqliteupsert

解决方案


可以sqlite_sequence像这样操作表:

UPDATE sqlite_sequence SET seq=(SELECT MAX(id) FROM Views) WHERE name="Views"

这会将序列“重置”为上次使用id的 .

然而,这根本没有用。在批量 UPSERT 期间更新sqlite_sequence肯定会破坏性能,并且在操作后这样做不会避免键序列中的“漏洞”。

另一种选择是重写 all id,但你真的需要这样吗?


推荐阅读