sql - 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
。
我不想在替换主键时更改它(发生冲突)。我该怎么办?
解决方案
ON REPLACE
删除有冲突的行并插入一个新行。所以,是的,除非它包含在要插入的值中,否则 rowid 将会改变。
如果您使用的是 sqlite 3.24 或更新版本,则可以使用不同类型的冲突解决方案,它允许您在违反特定唯一约束时仅更新某些列。它被称为UPSERT。对于这种情况,这是您的最佳选择。
另一种选择涉及尝试插入、检测唯一性错误并进行更新。如果卡在旧版本上,我只会走这条路。
编辑:你真的需要AUTOINCREMENT吗?
推荐阅读
- date - 如何用 Rust 打印接下来的几周?
- python - 平均函数返回 INF?
- .net - .Net 禁用表单或禁用鼠标单击,直到它完全加载
- python - 使用 tkinter 中的顶层在另一个模块中的窗口上创建一个新窗口
- json - 如何在 vb.net 中反序列化这个 JSON
- reactjs - 模态正文内容未显示 React,也没有控制台错误
- node.js - Puppeteer - 通过 xPath 获取元素
- regex - Google Colab 使用什么类型的正则表达式来查找和替换功能
- php - 检查关联数组是否为空
- python - 在 Python 中使用 H5T_ARRAY