SQLite WITHOUT ROWID 主键:同样的建表字段,为什么空值规则变了 主键写在纸上,约束还要看表的类型把普通表的建表语句末尾加上 WITHOUT ROWID,字段名称没有变化,旧数据却可能导入失败。最容易忽略的原因是主键中的空值:SQLite 为兼容历史行为,普通、非 STRICT 的... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
SQLite json_set 路径边界:缺少父对象能补上,父位置是 null 为什么却不更新 一批配置里有的记录没有 prefs,有的把 prefs 写成 JSON null。给它们统一执行 json_set(doc, '$.prefs.theme', 'dark'),结果前者增加了对象,后者仍然原样返回。函... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
SQLite 加一个月:一月三十一日,为什么会算到三月二日 给一月三十一日加一个月,原本期待二月底,SQLite 却返回三月二日。这里不能把一个月当成固定天数,也不能假定所有日期库都会自动夹到目标月份末日。月份长度不同会产生无对应日期的情况,需要先约定遇到月底时采用哪条规则。... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
SQLite UPDATE OF 触发器:列名拼错了,为什么创建成功却一直不响 给库存表增加一个数量变化日志,迁移脚本显示 CREATE TRIGGER 成功,更新后却始终没有日志。反复检查提交和连接仍找不到原因,最后发现 UPDATE OF 后面的 quantity 少了一个字母。SQLite... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
SQLite 空值排序:改成降序后,缺失记录为什么换到了另一端 一个清单按预计耗时从小到大显示,未填写耗时的项目突然出现在最前面。改成降序后,它们又跑到最后。开发者原本只想翻转已有数字的顺序,却同时改变了缺失记录的位置。SQLite 默认在升序时把 NULL 排在前面,降序时放在... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读
SQLite LIMIT 两种写法:只是把 OFFSET 换成逗号,为什么取回了另一页 维护分页查询时,把 LIMIT ? OFFSET ? 改成 LIMIT ?, ?,占位符数量仍然是两个,程序也没有报错,却把“取三条、跳过两条”变成“跳过三条、只取两条”。SQLite 支持这两种语法,但它们的参数顺... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
SQLite changes 与 total_changes:插入两行,触发器多写的两行算在哪里 一次插入两条主记录,触发器又为每条写一条日志。应用拿 changes 得到二,另一个统计却显示四,看起来像数据库多执行了插入。其实两个计数器的范围不同:一个看最近完成的主语句直接影响多少行,另一个累计这个连接执行过的... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
SQLite ORDER BY 同名别名:原列是数字,排序为什么先出现 10 再出现 2 报表把数值统一显示为两位小数,顺手让格式化结果沿用原列名称 n,再写 ORDER BY n。表里明明存着数字,输出却把 10.00 排在 2.00 前面。应先看排序名称最终指向哪个表达式:在这里,它指向同名的输出别名... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
SQLite HAVING 不写 GROUP BY:三条输入为什么最后只剩一行或零行 想在待办数量达到门槛时返回一个汇总,查询写了 count 和 HAVING,却没有 GROUP BY。它并不会为每条任务分别做一次门槛判断:这是整体聚合,所有经过筛选的输入共同形成一份统计,条件决定这份统计是否进入结... yunqueblog/ 技术教程/ 2026-10-02/ 2 阅读
SQLite 延迟外键:COMMIT 已经报错,事务为什么还没有结束 导入关联数据时,子记录先到,父记录稍后才写入。延迟外键允许这类暂时不完整的状态存在于事务内部,但提交时仍必须满足约束。容易漏掉的是恢复动作:COMMIT 因延迟外键失败之后,事务可能仍然开着,已经执行的插入也还在其中... yunqueblog/ 技术教程/ 2026-10-02/ 3 阅读