在SQLite中将冲突策略用作REPLACE时,保留主键的值

时间:2018-11-13 09:00:18

标签: sql sqlite android-sqlite

我创建了一个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 :(得分:0)

ON REPLACE删除存在冲突的行并插入新行。因此,是的,除非要插入的值中包含该rowid,否则它将进行更改。

如果您使用的是sqlite 3.24或更高版本,则可以使用另一种类型的冲突解决方案,当您违反特定的唯一约束时,仅允许您更新某些列。它被称为UPSERT。对于这种情况,这是您最好的选择。

另一种选择涉及尝试插入,检测唯一性错误并进行更新。如果卡在旧版本上,我只会走这条路。

编辑:必须真的需要AUTOINCREMENT吗?