SQLite的全文搜索扩展(FTS3、FTS4、FTS5)创建影子表。例如,如果我创建 FTS5 表
CREATE VIRTUAL TABLE test USING fts5(textData);
这还将自动创建几个真实(非虚拟)表,test_content其中(显然)存储插入到原始虚拟表中的实际数据test。
我知道 SQLite 作者建议这些影子表“不应由用户直接访问”。但是从文档中不清楚是否对这些表的行为没有任何保证,或者这个建议主要关注直接INSERT或UPDATE在它们上的尝试。但是从这些表中读取有什么风险?
具体来说 - 我需要另一个(常规)表来获得虚拟 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.
这是有效的,因为从直接检查来看,表的rowid值test始终等于表的id列值test_content。即使当我rowid手动指定时,也会INSERT INTO test (rowid, value) VALUES (424242, 'foobar');出现一个新行,其中test_content包含相应的内容和对应的id等于424242(即使表中没有先前的记录)。
所以基本上,我的问题是 - rowidFTS5 表和id相应<name>_content影子表之间的这种对应关系是否可以保证?或者这可能会在某些情况下或在未来的版本中中断?