You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLite数据写入问题:实现非空约束下的插入与更新逻辑

解决SQLite Upsert同时过滤NULL值的问题

直接给你能满足需求的SQL语句,再拆开讲逻辑:

最终可用的SQL

INSERT INTO ImportantTable (ID, Foo)
VALUES 
   (0, 'Bar'),
   (1, 'Spam'),
   (2, 'MoreSpam'),
   (3, NULL)
ON CONFLICT(ID) DO UPDATE
SET Foo = excluded.Foo
WHERE excluded.Foo IS NOT NULL;

为什么这能满足你的需求?

  1. 自动拦截NULL值:因为表定义里Foo是NOT NULL,当你插入像(3, NULL)这种行时,SQLite会直接拒绝这一行的插入,但不会影响其他合法行的执行——完全由数据库处理,不用Python提前过滤。

  2. 实现Upsert逻辑:

    • 新ID(不存在于表中):只要Foo非空,就正常插入。
    • 已有ID:只有当新的Foo值非空时,才会把旧行的Foo更新成新值;如果新Foo是NULL,就跳过更新,保留原有数据。
  3. 避开INSERT OR REPLACE的坑:INSERT OR REPLACE在冲突时会先删除旧行再插入新行,如果新行有NULL值,会触发非空约束报错,而上面的语句只会针对ID冲突做更新,且加了NULL判断,不会出现这个问题。

版本要求

确保你的SQLite版本≥3.24.0,ON CONFLICT的Upsert语法是这个版本才加入的。

内容的提问来源于stack exchange,提问作者Kipyneter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 01:03:11