我正在使用 SQLite3 数据库。我想创建一个 FTS5 无内容(内容=“”)或内容=“外部表”表来节省空间并防止数据重复(如果我不使用无内容或外部表,则会发生这种情况)内容表)。
我的场景=>
tableA (textColumn, idColumn)
tableB (textColumn, idColumn)
tableFTS5 (textColumn, textIdColumn, tableNameColumn)
我做什么=>
我将数据插入到表A和表B中。 然后我从 tableA 中读取所有行并将其插入到 tableFTS5 表中:
tableFTS5.textColumn = tableA.textColumn,
tableFTS5.textIdColumn = tableA.idColumn,
tableFTS5.tableNameColumn = "tableA"
我也使用 tableFTS5.tableNameColumn = "tableB" 对 tableB 重复此操作。我需要的是=>
我想使用一些搜索文本查询 tableFTS5 的 FTS 索引,并且只想检索 tableFTS5.textIdColumn 和 tableFTS5.tableNameColumn。 有了这两列值,我就可以从 tableA 或 tableB 中检索原始数据。
如果 tableFTS5 是无内容表或 content="external" 表,是否可以通过某些触发器或任何其他方法从 tableFTS5 检索这些列?
我的信息来源
我有两个带有文本数据的主表(我不想重复这些数据)。
我创建一个映射表来将主表名称及其文本 ID 映射到 FTS 表的 rowid。
我有一个 FTS 无内容表,它只返回 rowid。
但是使用这种方法我还必须管理 FTS 表和映射表的插入、删除操作。这变得太复杂而难以管理,因此我决定为每个主表创建单独的 FTS 表并设置 content="该主表名称"
但是我真的更喜欢无内容 FTS 表有一个选项来存储和返回一些用户指定的列,以便存储一些 id 而不是文本内容列(因为这会创建文本重复)。
我试图实现的称为一对一多态关系,因此我不必创建太多表。
如果我对无内容 FTS 表有此选项,那么对于 6 个文本数据表,我将仅创建一个 FTS 表,因此表总数 = 7。 但现在如果没有这个选项,我将创建 12 个表,6 个主表和 6 个 FTS
我请求开发者将这个选项添加到sqlite中。非常感谢
CREATE VIRTUAL TABLE IF NOT EXISTS fts_tbl USING fts5(a, b, c, content='')
创建触发器,以便它随着您想要索引更新的表而更新:
CREATE TRIGGER IF NOT EXISTS tbl_ai AFTER INSERT ON tbl BEGIN
INSERT INTO fts_tbl(rowid, a, b, c) VALUES (new.ROWID, new.a, new.b, new.c);
END
CREATE TRIGGER IF NOT EXISTS tbl_ad AFTER DELETE ON tbl BEGIN
INSERT INTO fts_tbl(fts_tbl, rowid, a, b ,c) VALUES('delete', old.ROWID, old.a, old.b, old.c);
END
CREATE TRIGGER IF NOT EXISTS tbl_au AFTER UPDATE ON tbl BEGIN
INSERT INTO fts_tbl(fts_tbl, rowid, a, b, c) VALUES('delete', old.ROWID, old.a, old.b, old.c);
INSERT INTO fts_tbl(rowid, a, b, c) VALUES (new.ROWID, new.a, new.b, new.c);
END
然后用您感兴趣的表中的数据填充它:
INSERT INTO fts5_tbl (rowid, a, b, c) SELECT ROWID, a, b, c FROM tbl
现在您可以查询它并从表中返回数据,如下所示:
SELECT rank, t.a, t.b, t.c FROM tbl t JOIN fts_tbl f ON t.ROWID = f.ROWID WHERE fts_tbl MATCH "search" ORDER BY rank;