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;
为什么这能满足你的需求?
自动拦截NULL值:因为表定义里
Foo是NOT NULL,当你插入像(3, NULL)这种行时,SQLite会直接拒绝这一行的插入,但不会影响其他合法行的执行——完全由数据库处理,不用Python提前过滤。实现Upsert逻辑:
- 新ID(不存在于表中):只要Foo非空,就正常插入。
- 已有ID:只有当新的Foo值非空时,才会把旧行的Foo更新成新值;如果新Foo是NULL,就跳过更新,保留原有数据。
避开
INSERT OR REPLACE的坑:INSERT OR REPLACE在冲突时会先删除旧行再插入新行,如果新行有NULL值,会触发非空约束报错,而上面的语句只会针对ID冲突做更新,且加了NULL判断,不会出现这个问题。
版本要求
确保你的SQLite版本≥3.24.0,ON CONFLICT的Upsert语法是这个版本才加入的。
内容的提问来源于stack exchange,提问作者Kipyneter
相关产品推荐
相关产品推荐

