http://en.wikipedia.org/wiki/Upsert
在 SQLite 中是否有一些我没有想到的聪明方法?
基本上,如果记录存在,我想更新四列中的三列,如果不存在,我想用第四列的默认(NUL)值插入记录。
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,这意味着要更新的每个发送的行都需要: Prepare/Bind/Step/Finalize 语句与允许使用重置功能的 INSERT 语句不同
语句对象的生命周期是这样的:
- 使用 sqlite3_prepare_v2() 创建对象
- 使用 sqlite3_bind_ 接口将值绑定到主机参数。
- 通过调用 sqlite3_step() 运行 SQL
- 使用 sqlite3_reset() 重置语句,然后返回步骤 2 并重复。
- 使用 sqlite3_finalize() 销毁语句对象。
UPDATE 我猜与 INSERT 相比速度很慢,但它与使用主键的 SELECT 相比如何?
也许我应该使用 select 来读取第 4 列(Blob3),然后使用 REPLACE 编写一条新记录,将原始第 4 列与前 3 列的新数据混合?