我已经按照https://kimsereylam.com/sqlite/2020/03/06/full-text-search-with-sqlite.html设置了SQLite's virtual table extension FTS5,以便对外部内容表进行全文搜索,而博客展示了如何设置触发器,以保持虚拟FTS表使用数据进行更新:
CREATE TABLE user (
id INTEGER PRIMARY KEY,
username TEXT NOT NULL UNIQUE,
email TEXT NOT NULL UNIQUE,
short_description TEXT
)
CREATE VIRTUAL TABLE user_fts USING fts5(
username,
short_description,
email UNINDEXED,
content='user',
content_rowid='id'
)
CREATE TRIGGER user_ai AFTER INSERT ON user
BEGIN
INSERT INTO user_fts (rowid, username, short_description)
VALUES (new.id, new.username, new.short_description);
END;
...
我无法以类似的方式从所有以前的数据填充FTS表。我将坚持使用博客中的示例:
INSERT INTO user_fts (rowid, username, short_description) SELECT (id, username, short_description) FROM user;
然而,sqlite(3.37.2)在row value misused
上失败了。
请解释id
、content_rowid
、rowid
和new.id
之间的关系,以及如何修改查询以正确更新FTS表。
1条答案
按热度按时间yi0zb3m41#
(no括号)起作用。
rowid
是唯一的64位无符号整数行ID。如果表包含整数主键(如user
中的id
),则它们相同(别名)。即user. rowid == www.example.com = user_fts. rowid。user.id = user_fts.rowid.文件:www.example.comhttps://www.sqlite.org/lang_createtable.html#rowid
new
表示要插入的元素。文件:https://www.sqlite.org/lang_createtrigger.html
content_rowid
将虚拟FTS表链接到外部数据表行id列(默认为rowid)。文件:www.example.comhttps://www.sqlite.org/fts5.html#external_content_tables