http://en.wikipedia.org/wiki/Upsert
是否有一些聪明的方法可以在SQLite中完成这个操作,而我没有考虑到的呢?
基本上,如果记录存在,则我要更新四列中的三列。 如果记录不存在,则我希望使用第四列的默认(NULL)值插入该记录。
ID是主键,因此只会有一条记录进行UPSERT。
(显然,我正在尝试避免SELECT的开销,以确定是否需要UPDATE或INSERT)
有什么建议吗?
我无法在SQLite网站上确认关于TABLE CREATE的语法。 我还没有构建演示来测试它,但似乎不受支持。
如果是这样,我有三列,所以实际上看起来像:
CREATE TABLE table1(
id INTEGER PRIMARY KEY ON CONFLICT REPLACE,
Blob1 BLOB ON CONFLICT REPLACE,
Blob2 BLOB ON CONFLICT REPLACE,
Blob3 BLOB
);
但前两个 Blob 不会导致冲突,只有 ID 会 所以我假设 Blob1 和 Blob2 不会被替换(如所需)
在绑定数据时,SQLite 中的 UPDATE 操作是完整事务,这意味着每个要更新的发送行都需要进行准备 / 绑定 / 步骤 / 完成语句,而 INSERT 则允许使用重置功能
语句对象的生命周期大致如下:
- 使用 sqlite3_prepare_v2() 创建对象
- 使用 sqlite3_bind_ 接口将值绑定到主机参数
- 通过调用 sqlite3_step() 运行 SQL
- 使用 sqlite3_reset() 重置语句,然后回到步骤 2 并重复。
- 使用 sqlite3_finalize() 销毁语句对象。
我猜更新操作比 INSERT 操作慢,但是与使用主键的 SELECT 操作相比如何?
也许我应该使用 select 来读取第 4 列(Blob3),然后使用 REPLACE 写入新记录,将原始的第 4 列与前 3 列的新数据混合?