SQLite:引用FTS5阴影表中数据的外键
SQLite(FTS3、FTS4、FTS5)的用户可以创建影子表。例如,如果我创建FTS5表SQLite:引用FTS5阴影表中数据的外键,sqlite,full-text-search,fts3,fts4,Sqlite,Full Text Search,Fts3,Fts4,SQLite(FTS3、FTS4、FTS5)的用户可以创建影子表。例如,如果我创建FTS5表 使用fts5(textData)创建虚拟表测试; 这也将自动创建几个真实(非虚拟)表,其中包含test\u内容,它(显然)存储插入原始虚拟表test的实际数据 我知道SQLite的作者建议这些影子表“不应该被用户直接访问”。但是,从文档中还不清楚这些表的行为是否完全没有任何保证,或者这个建议主要涉及直接在它们上插入或更新。但从这些表格中阅读的风险是什么 特别是-我需要另一个(常规)表具有引用虚拟FTS
使用fts5(textData)创建虚拟表测试;
这也将自动创建几个真实(非虚拟)表,其中包含test\u内容
,它(显然)存储插入原始虚拟表test
的实际数据
我知道SQLite的作者建议这些影子表“不应该被用户直接访问”。但是,从文档中还不清楚这些表的行为是否完全没有任何保证,或者这个建议主要涉及直接在它们上插入或更新。但从这些表格中阅读的风险是什么
特别是-我需要另一个(常规)表具有引用虚拟FTS5表的rowid
的外键:
使用fts5(textData)创建虚拟表测试;
创建表myTable(col1整数引用测试(rowid));
我在文档中找不到这方面的提示,但我自己的实验表明外键在这里不起作用-我仍然可以从test
表中删除记录,即使它们是从myTable
中引用的。然而,如果我这样做
使用fts5(textData)创建虚拟表测试;
创建表myTable(col1整数引用test_content(id));
然后,一切似乎都按需工作-如果记录是从myTable
引用的,我无法从虚拟test
表中删除记录
这是因为,与直接检查一样,test
表的rowid
值始终等于test\u内容
表的id
列值。甚至当我手动指定rowid
时,就像在插入测试(rowid,value)值(424242,'foobar')代码>-然后在测试内容中出现一个新行,相应的内容和相应的id
等于424242
(即使表中没有以前的记录)
所以基本上,我的问题是-FTS5表的rowid
和相应\u内容的id
之间的这种对应关系是否保证保持不变?或者在某些情况下或在将来的版本中可能会出现这种情况?您能否给出一个提示,说明如何在FTS5表上实现类似的外键约束?比如说,我有一个带有文档ID的普通表和一个带有这些文档内容的FTS5表。问题是,如果第一个表中存在相应的文档ID,如何防止从FTS5表中删除内容?我想这可以通过触发器来实现,但是虚拟表(afaik)也不支持触发器。