首页 > 解决方案 > SQLite:FTS5 影子表中的外键引用数据

问题描述

SQLite的全文搜索扩展(FTS3、FTS4、FTS5)创建影子表。例如,如果我创建 FTS5 表

CREATE VIRTUAL TABLE test USING fts5(textData);

这还将自动创建几个真实(非虚拟)表,test_content其中(显然)存储插入到原始虚拟表中的实际数据test

我知道 SQLite 作者建议这些影子表“不应由用户直接访问”。但是从文档中不清楚是否对这些表的行为没有任何保证,或者这个建议主要关注直接INSERTUPDATE在它们上的尝试。但是从这些表中读取有什么风险?

具体来说 - 我需要另一个(常规)表来获得虚拟 FTS5 表的FOREIGN KEY哪些引用:rowid

CREATE VIRTUAL TABLE test USING fts5(textData);
CREATE TABLE myTable (col1 INTEGER  REFERENCES test(rowid));

我在文档中找不到这方面的提示,但我自己的实验表明外键在这里不起作用——test即使它们是从表中引用的,我仍然可以从表中删除记录myTable。但是,如果我这样做

CREATE VIRTUAL TABLE test USING fts5(textData);
CREATE TABLE myTable (col1 INTEGER  REFERENCES test_content(id));

然后一切似乎都按需要工作 -test如果从myTable.

这是有效的,因为从直接检查来看,表的rowidtest始终等于表的id列值test_content。即使当我rowid手动指定时,也会INSERT INTO test (rowid, value) VALUES (424242, 'foobar');出现一个新行,其中test_content包含相应的内容和对应的id等于424242(即使表中没有先前的记录)。

所以基本上,我的问题是 - rowidFTS5 表和id相应<name>_content影子表之间的这种对应关系是否可以保证?或者这可能会在某些情况下或在未来的版本中中断?

标签: sqlitefull-text-searchfts3fts4

解决方案


推荐阅读