工具笔记
让 AI 写可重跑的 SQLite 导入器
把幂等键定义成数据库唯一约束。

资料核验2026.11.12 · SQLite · 本地数据库与小型服务
导入文件可能重跑,第一次导到一半失败也很常见。用本地自增 ID 判断是否已导入没有意义,因为同一条远端记录每次都能生成新 ID。
给 AI 的上下文与边界
给助手两份同来源数据和一条本地备注,要求用来源加外部 ID 定义稳定身份。让它展示冲突处理更新哪些列,列出本地拥有、远端拥有的字段。

先定义什么叫同一条记录
为来源和外部 ID 建组合唯一约束。SQLite 的 UPSERT 可以用 ON CONFLICT 指向这组键,选择忽略或更新。同步时只更新远端负责的列,本地编辑的备注留在原记录上。
用同一份文件导两次,检查行数不变。再把一条远端记录的名称改掉后导入,确认名称更新、备注仍在。
如果源系统没有稳定 ID,先处理身份规则。用会变化的标题当键,会让一次改名变成新增。
可以直接照着做的演练
同一个来源两次推送 ID 42,标题从「初稿」改为「修订」,本地备注叫「人工确认」。跑三轮后应仍只有该来源的一条 ID 42,标题已更新,备注保留。另一个来源同 ID 则应形成独立记录。
检查生成结果
- 导入同一文件两次行数不变。
- 改远端名称后旧行更新。
- 本地备注不丢。
- 同一外部 ID 来自两个来源时按独立记录处理。
复查时追问一层
不能只测「重复运行没抛错」。同时核对行数、身份键和本地备注。如果来源没有稳定 ID,先约定业务如何区分改名与新增,再写 UPSERT。
给助手一份列所有权说明:远端管标题和原链接,本地管审核状态和备注。字段存在但为空时是清空还是忽略也要写明。用带空标题和已收藏条目的样本验证,不要让一次同步把编辑者已做的选择改回默认。
前提是表对 source 和 external_id 建了组合唯一约束。语句没有覆盖本地备注列。
INSERT INTO imported_items (source, external_id, title)
VALUES (?, ?, ?)
ON CONFLICT(source, external_id)
DO UPDATE SET title = excluded.title;
