SQLite - UPSERT *not* INSERT 或 REPLACE
技术问答
204 人阅读
|
0 人回复
|
2023-09-12
|
在 SQLite 有没有一些我没想到的聪明方法可以做到这一点?+ M! a H- e# q% g' {4 v- P
基本上,如果有记录,我想更新四列中的三列。如果不存在,我想使用第四列的默认 (NUL) 插入值记录。
3 ?$ R7 ]$ ~% M ^, O5 t' bID 是主键,所以 UPSERT 将永远只有一个记录。
3 h. F4 K" }6 L: _(我试图避免 SELECT 的费用,以确定我是否需要 UPDATE 或 INSERT 显然)
6 |0 u! I! {% `: V建议?
- m2 Y& ]0 T& _" e% o9 J; }/ {1 a我无法在 SQLite 站点确认 TABLE CREATE 语法。我还没有建立一个演示来测试它,但它似乎不受支持。) x( r* l. C! [& N+ Z0 y3 z [) o" o
如果是的话,我有三列,所以它实际上看起来像:
! G5 r3 }. s7 M- \CREATE TABLE table1( id INTEGER PRIMARY KEY ON CONFLICT REPLACE, Blob1 BLOB ON CONFLICT REPLACE, Blob2 BLOB ON CONFLICT REPLACE, Blob3 BLOB );
) ~* A4 Y+ d7 H' L. P7 { 但前两个 blob 不会引起冲突,只有 ID 会所以我假设 Blob1 和 Blob2 不会被替换(根据需要)9 g5 Z7 Q$ f- }" a% Y4 c2 K- p
当绑定数据是一个完整的事务时,SQLite 中的更新,这意味着要更新的每个发送的行都需要: Prepare/Bind/Step/Finalize 语句和 ,允许使用重置功能INSERT 不同
4 W( A& R- {9 b7 h" {语句对象的生命周期如下:
. e; N! U, ]3 f: O k[ol]使用 sqlite3_prepare_v() 创建对象
9 { w( C r$ f/ V3 j+ r6 [+ w使用 sqlite3_bind_ 接口将值绑定到主机参数。
1 |# U8 _% K( Q0 H通过调用 sqlite3_step() 操作 SQL
& M; m' Z% d) N, D0 k6 R使用 sqlite3_reset() 重置句子,然后返回步骤 2 并重复。5 a5 s9 m& U" Z3 ]: G
使用 sqlite3_finalize() 销毁语句对象。[/ol]UPDATE 我猜与 INSERT 相对较慢,但与使用主键 相比SELECT 比较如何?* f* j# C( d& c2 _0 z
也许我应该用 select第 4 列 (Blob3),然后使用 REPLACE 编写新记录,将原始第 4 列与前 3 列的新数据混合?2 p8 J& p, Y: x' ?) Q4 F
9 O6 O. F7 e+ d( e
解决方案: |
|
|
|
|
|