Сохраните значение первичного ключа при использовании стратегии конфликта в качестве ЗАМЕНА в SQLite - PullRequest
0 голосов
/ 13 ноября 2018

Я создал таблицу SQLite следующим образом

CREATE TABLE event 
(_id INTEGER PRIMARY KEY AUTOINCREMENT, 
event_id TEXT NOT NULL, 
instance_id TEXT NOT NULL, 
...., 
UNIQUE (event_id, instance_id) ON CONFLICT REPLACE)

Теперь, когда при вставке возникает конфликт, SQLite заменяет строку новой строкой, что, в свою очередь, меняет мой первичный ключ _id.

Я не хочу менять свой первичный ключ при его замене (при конфликте). Что мне делать?

1 Ответ

0 голосов
/ 13 ноября 2018

ON REPLACE удаляет строку с конфликтом и вставляет новую.Так что, да, rowid будет меняться, если он не включен во вставляемые значения.

Если вы используете sqlite 3.24 или новее, доступен другой тип разрешения конфликтов, который позволяет обновлять только определенныестолбцы, когда конкретное уникальное ограничение нарушается.Он известен как UPSERT .Это ваш лучший вариант для этого случая.

Другой вариант включает в себя попытку вставки, обнаружение ошибки уникальности и обновление вместо этого.Я бы пошел по этому пути, только если бы застрял на старой версии.

Редактировать: обязательно действительно нужно АВТОИНФОРМИРОВАНИЕ ?

...