回答

收藏

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
    解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则