对于SQLite3 FTS5外部内容表,这一现象可能来自内容表与全文索引不一致,不能仅凭两种查询的结果差异就确定全部原因。FTS5 external-content表在查询不含MATCH、也不使用等价表值函数语法时,查询会直接交给内容表执行,所以全文索引未建或不一致时,普通查询仍可能看到旧记录;查询一旦使用MATCH,就会走全文索引取得匹配的rowid,再按rowid回内容表取列值,索引缺少对应条目时,同一内容就可能找不到。后来补建同步触发器只影响之后的写入,不会自动回填已有行,应用仍须维护内容表与索引的一致性。

AI台式电脑工作台示意图
AI台式电脑维护示意图,非真实门店、技师或客户实拍。

适用:Windows台式电脑上使用SQLite3 FTS5外部内容表且content=非空的本地应用。先核对实际库版本、功能与编译配置,只查看已有去敏schema、SQL和日志;不修改生产库,不重发写入,也不制造崩溃来验证。重点确认原建表顺序、content=与content_rowid=设置、同步触发器是否覆盖插入更新删除,以及历史回填是否有记录。

观察:先核对FTS5表定义和内容表定义,看外部内容表是否在内容表已有数据后才创建;若创建时内容表已有行而索引没有对应条目,非MATCH能见旧记录、MATCH可能无结果。再查看触发器原文和创建时间,若触发器晚于存量数据才出现,或缺少某类写入同步,只能说明后续写入是否被覆盖,不能证明存量行已回填。还可对照普通查询与MATCH查询结果,并核对回填脚本或日志是否有实际执行记录。结果条件是:非MATCH可见而MATCH找不到同一内容,且原建表、触发器或回填记录存在缺口,就应按外部内容表一致性方向排查。

风险:主要风险是把“内容表有记录”误当成“全文索引可用”。只给后续写入补触发器而不处理已有行,存量记录仍可能无法被MATCH找到;直接rebuild、删除索引或修改影子表会改变现场,并绕过对原建表、触发器和回填记录的核查,使不一致范围更难判断。应用若继续在不一致状态上写入,也可能让新旧记录的索引覆盖情况不同。

下一步:整理去敏材料,包括SQLite实际版本与编译配置、原建表语句、FTS5外部内容表定义、content=与content_rowid=设置、同步触发器原文、历史回填脚本或记录、近期写入更新删除日志,以及普通查询与MATCH查询的结果差异,不要附完整业务数据。可拨打电脑快修网400-877-9605咨询,说明是济南历下区台式电脑上的SQLite FTS5外部内容表一致性问题;该号码只作咨询,实际范围和安排需确认。处理前仍以核对原建表、触发器和回填记录为先,不直接对生产库重建索引、删除索引或改影子表。