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
(即使表中没有先前的记录)。
所以基本上,我的问题是 - rowid
FTS5 表和id
相应<name>_content
影子表之间的这种对应关系是否可以保证?或者这可能会在某些情况下或在未来的版本中中断?