Как избежать использования key-id при использовании upsert с ключом автоинкремента в SQLite? - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть таблица, подобная приведенной ниже:

id - это PK и автоинкремент.

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

Когда я использую запрос upsert blelow, и 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  |
+-----+--------+--------+

1 Ответ

0 голосов
/ 27 февраля 2020

можно манипулировать таблицей sqlite_sequence следующим образом:

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

, которая "сбросит" последовательность до последнего использованного id.

Однако это не так, полезно на всех. Обновление sqlite_sequence во время массового UPSERT наверняка нарушит производительность, а выполнение этого после операции не позволит избежать «дыр» в последовательности клавиш.

Другой вариант - переписать все id, но вам это действительно нужно?

...