http://en.wikipedia.org/wiki/Upsert
在我没有想到的SQLite中,有什么聪明的方法可以做到这一点吗?
基本上,如果记录存在,我想更新四列中的三列;如果不存在,我想使用第四列的默认(NUL)值插入记录。
ID是一个主键,因此UPSERT只会有一个记录。
(我试图避免SELECT的开销,以便确定是否需要显式更新或插入)
有什么建议吗?
我无法在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不同,后者允许使用reset函数
语句对象的寿命如下所示:
- 使用sqlite3_prepare_v2()创建对象
- 使用sqlite3_bind_接口将值绑定到主机参数。
- 通过调用sqlite3_step()运行SQL
- 使用sqlite3_reset()重置该语句,然后返回到步骤2并重复。
- 使用sqlite3_finalize()销毁语句对象。
我猜测UPDATE与INSERT相比比较慢,但是与使用主键的SELECT相比又如何呢?
也许我应该使用select读取第4列(Blob3),然后使用REPLACE编写一条将原始第4列与前3列的新数据混合在一起的新记录?