我正在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中有一些隐藏的限制,从而排除了这种触发器?

这里的任何帮助都将不胜感激!

推荐答案

这是将TRUSTED_SCHEMA pragma设置为False的副作用.

杂注是在Sqlite 3.31中添加的,并被记录为默认为True,但3.42现在让sqlite3shell 程序在默认情况下禁用它.这似乎是一个新选项--unsafe-testing的副作用.如果不存在该选项,则包括此选项在内的多个设置将从其默认设置切换.

幸运的是,用户代码中的数据库连接没有受到影响,只是使用标准的sqlite3程序建立的连接.因此,您可以使用--unsafe-testing调用它,或者在启动shell 后运行以下命令(每次都是;它不是持久性的):

PRAGMA trusted_schema=1;

Sql相关问答推荐

获取家谱树中第一次出现的特定信息,然后停止

无法找到正确的SQL查询需求

当有空单元格时,如何连接列

使用Lead获取下一个不同的日期

为什么在postgres中,横向连接比相关子查询快?

对非RUST源代码字符串使用`stringify!`,例如SQL查询

检索上一个星期四和上一个星期三

用于过滤嵌套对象或数组中的JSON数据的WHERE条件

如何将`now()`作为SQL插入语句的一部分?

如何使用SQL Server中的Nodes()方法执行与OPENXML相同的操作

PostgreSQL:查找继承表中的特定记录属于哪个表

替换SQL Server XML中多处出现的 node 值

如何使用 join 和 where 子句从另一表中仅删除一个表中的值

避免在SQL中使用具有相同条件的多个子查询

SQL的左连接在多对多关系情况下使用

带聚合函数的 percentile_cont

在 SQL 中使用循环遍历按时间顺序排列的数据

添加一列并根据其他列值进行填充

基于源表的 SQL INSERT、UPDATE 和 DELETE

如何使用子查询锁定此查询中的选定行?