首页 > 解决方案 > SQLite中使用冲突策略作为REPLACE时保留主键的值

问题描述

我创建了一个 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 会用新行替换该行,这反过来会更改我的 primary key _id

我不想在替换主键时更改它(发生冲突)。我该怎么办?

标签: sqlsqliteandroid-sqlite

解决方案


ON REPLACE删除有冲突的行并插入一个新行。所以,是的,除非它包含在要插入的值中,否则 rowid 将会改变。

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

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

编辑:你真的需要AUTOINCREMENT吗?


推荐阅读