Sqlite INSERT OR REPLACE увеличивает rowid - PullRequest
1 голос
/ 01 августа 2020

Я использую синтаксис INSERT OR REPLACE для вставки или обновления строки, которая может существовать на основе уникального ограничения столбца в таблице.

Структура таблицы

| Name | Age | CustomerId (unique) | 

Когда я распечатываю таблицу в первый раз, я получаю что-то вроде

| Name | Age | CustomerId | rowid |
|"Bob" | 22  | 5          | 1     |

Затем я запускаю INSERT OR REPLACE INTO MyTable(Name, Age, CustomerId) VALUES ("Bob", 23, 5);"

В обязательном порядке это будет увеличивать столбец rowid каждый раз, когда он запустить. Итак, теперь результат:

| Name | Age | CustomerId | rowid |
|"Bob" | 23  | 5          | 2     |

Как предотвратить увеличение rowid?

1 Ответ

1 голос
/ 01 августа 2020

Вот как работает INSERT OR REPLACE. Если происходит нарушение уникального индекса / ограничения, то существующая строка удаляется, а новая строка вставляется, поэтому для новой строки назначается новый rowid.

Если вы не хотите, чтобы это произошло, вы должны использовать UPSERT:

insert into tablename(Name, Age, CustomerId) values ('Bob', 23, 5)
on conflict(CustomerId) do update 
set Name = excluded.Name,
    Age = excluded.Age;

См. demo .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...