SQLite 备份不只是复制一个文件
成功复制文件并不等于备份可恢复,数据库写入过程中尤其如此。
继续阅读恰西 / 按主题阅读
成功复制文件并不等于备份可恢复,数据库写入过程中尤其如此。
继续阅读字符串格式统一只是起点,业务上的月份还依赖时区。一个 UTC 时刻换算到当地时间后可能进入下个月,因此报表需要明确使用哪个时间边界。
继续阅读分页需要稳定的排序规则,否则相邻页可能重叠或遗漏。 数据持续变化时,按偏移量切片可能在两次请求之间产生重复或遗漏。即使静态数据也需要明确排序,否则数据库没有义务按固定顺序返回行。
继续阅读左连接先保留左侧记录,并用空值补齐没有匹配的右侧字段。若随后要求右表字段满足某个普通条件,这些空值记录又会在 WHERE 阶段被排除。
继续阅读SQLite 查询计划能展示扫描和索引访问,适合作为优化前后的对照。
继续阅读索引更像辅助查找结构,不是所有查询的加速按钮。过滤条件、排序方式和数据分布都会影响收益,维护索引也会增加插入与更新成本。
继续阅读先查询再插入仍可能遭遇并发竞争,唯一性必须由约束保证。 两个并发请求都可能看到“目前不存在”,随后各自插入。数据库约束在写入时做最终判断,才有机会阻止竞争条件造成的重复记录。
继续阅读两项相关修改若分开提交,中间失败就可能留下不一致状态。事务把数据库内的工作组合成一个提交单元,调用方可以根据完整结果决定提交还是回退。
继续阅读参数绑定负责区分代码与数据,字符串拼接不能提供同等保障。
继续阅读一列允许 NULL 时,已存在的记录不一定拥有该列的值。统计记录总量和统计已填写某字段的数量,应使用不同表达式,才能让业务口径与结果一致。
继续阅读WHERE 过滤原始记录,HAVING 过滤分组后的聚合结果。 查询可以先从原始行里排除不符合条件的数据,再对剩余数据分组,最后筛选聚合结果。理解这两个过滤阶段,比死记 WHERE 和 HAVING 的名字更有效。
继续阅读探索表结构与生成业务结果有不同目标。显式列出需要的字段,既减少无用传输,也让调用方不容易受到新增列或列顺序变化的影响。
继续阅读