我正在try 通过跟随official documentation来使用外部内容表中的SQLite全文搜索(FTS)扩展.我运行的是Arch Linux Package sqlite
中的SQLite版本3.42.0,目前在版本3.42.0-1上.
模式如下:
-- Create main data table
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL
);
-- Create fts index table
CREATE VIRTUAL TABLE users_fts USING fts5 (
content='users',
content_rowid='id',
name
);
-- Create insert trigger
CREATE TRIGGER users_fts_insert AFTER INSERT ON users
BEGIN
INSERT INTO users_fts (rowid, name) VALUES (new.rowid, new.name);
END;
-- Insert some sample data
INSERT INTO users (rowid, name) VALUES
(NULL, 'John Smith'),
(NULL, 'John Doe'),
(NULL, 'Jane Doe');
在sqlite3
中运行上述步骤时,INSERT
步骤失败,并显示错误消息:
Parse error near line 21: unsafe use of virtual table "users_fts"
个
如果我注释掉触发器块,它会成功创建两个表并将值插入到主表中.奇怪的是,FTS表似乎也是使用匹配的行创建的,并且这些行似乎在不同的INSERT
/UPDATE
/DELETE
之间保持同步,尽管通过MATCH
实现的实际FTS功能不起作用(例如SELECT * FROM users_fts WHERE users_fts MATCH 'John'
不返回任何行).
因为我不想手动保持两个表的同步,所以我真的更希望有一个基于上述触发器的自动解决方案.问题出在我如何设置触发器,还是我如何配置FTS表?或者,也许在SQLite FTS中有一些隐藏的限制,从而排除了这种触发器?
这里的任何帮助都将不胜感激!