【发布时间】:2010-09-29 22:53:08
【问题描述】:
http://en.wikipedia.org/wiki/Upsert
Insert Update stored proc on SQL Server
在 SQLite 中是否有一些我没有想到的聪明方法?
如果记录存在,基本上我想更新四列中的三列, 如果它不存在,我想用第四列的默认 (NUL) 值插入记录。
ID 是主键,因此只有一条记录可用于 UPSERT。
(我试图避免 SELECT 的开销以确定我是否需要 UPDATE 或 INSERT 明显)
建议?
我无法在 SQLite 站点上确认 TABLE CREATE 的语法。 我还没有建立一个demo来测试它,但它似乎不被支持。
如果是,我有三列,所以它实际上看起来像:
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 中的更新,意味着 每个发送的要更新的行都需要: Prepare/Bind/Step/Finalize statements 与允许使用重置功能的 INSERT 不同
语句对象的生命周期是这样的:
- 使用 sqlite3_prepare_v2() 创建对象
- 使用 sqlite3_bind_ 接口将值绑定到主机参数。
- 通过调用 sqlite3_step() 运行 SQL
- 使用 sqlite3_reset() 重置语句,然后返回步骤 2 并重复。
- 使用 sqlite3_finalize() 销毁语句对象。
我猜 UPDATE 比 INSERT 慢,但它与使用主键的 SELECT 相比如何?
也许我应该使用 select 读取第 4 列 (Blob3),然后使用 REPLACE 写入一条新记录,将原始第 4 列与前 3 列的新数据混合?
【问题讨论】:
-
SQLite - UPSERT 在预发布版本中可用,参考:sqlite.1065341.n5.nabble.com/…
-
UPSERT 在 SQLite 3.24.0 版本中可用