为 SQLite 中的全文搜索索引创建 SQL 触发器
Creating SQL triggers for full text search index in SQLite
我正在尝试为常规 table 创建触发器,然后更新 SQLite 中的全文索引,但我遇到了一些错误,我不确定我在哪里出问题了。
我正在制作的应用程序是一个书签应用程序,我保存书签数据的数据库是使用以下 SQL 语句创建的:
create table "pages" (
"pageUrl" text not null unique on conflict replace,
"dateCreated" integer not null,
"pageDomain" text not null,
"pageTitle" text null,
"pageText" text null,
"pageDescription" text null,
"archiveLink" text null,
"safeBrowsing" text null,
primary key ("pageUrl")
);
然后创建全文搜索索引:
create virtual table fts using fts5(
content='pages',
content_rowid='pageUrl',
pageDomain,
pageTitle,
pageText,
pageDescription
);
那么我想在 "pages" table 通过插入或删除更新时更新 fts 索引。
我要插入的触发器:
create trigger afterPagesInsert after insert on pages begin
insert into fts(
rowid,
pageDomain,
pageTitle,
pageText,
pageDescription
)
values(
new.pageUrl,
new.pageDomain,
new.pageTitle,
new.pageText,
new.pageDescription
);
end;
删除触发器:
create trigger afterPagesDelete after delete on pages begin
insert into fts(
fts,
rowid,
pageDomain,
pageTitle,
pageText,
pageDescription
)
values(
'delete',
old.pageUrl,
old.pageDomain,
old.pageTitle,
old.pageText,
old.pageDescription
);
end;
这是我正在使用的 sql 插入语句的示例:
insert into "pages" (
"pageUrl",
"dateCreated",
"pageDomain",
"pageTitle",
"pageText",
"pageDescription",
"archiveLink",
"safeBrowsing"
)
values(
'https://www.reddit.com/',
1456465040177,
'reddit.com',
'reddit: the front page of the internet',
'reddit: the front page of the internet',
'reddit: the front page of the internet',
NULL,
NULL
)
删除语句:
delete from "pages" where "pageUrl" = 'https://www.reddit.com/'
但是,插入和删除触发器都出现 SQLITE_MISMATCH: datatype mismatch] errno: 20, code: 'SQLITE_MISMATCH'
错误,我猜这似乎表明错误的数据进入了错误的列,但我不知道为什么。我已经浏览了 docs here 外部内容表部分中的触发器部分,并且我已经按照列出的内容进行操作,所以我不确定哪里出错了。
如有任何帮助,我们将不胜感激。
注意:我使用的是fts5版本的SQLite全文搜索:https://www.sqlite.org/fts5.html
content_rowid
必须引用实际 table 的 rowid,即 INTEGER PRIMARY KEY 列。
我正在尝试为常规 table 创建触发器,然后更新 SQLite 中的全文索引,但我遇到了一些错误,我不确定我在哪里出问题了。
我正在制作的应用程序是一个书签应用程序,我保存书签数据的数据库是使用以下 SQL 语句创建的:
create table "pages" (
"pageUrl" text not null unique on conflict replace,
"dateCreated" integer not null,
"pageDomain" text not null,
"pageTitle" text null,
"pageText" text null,
"pageDescription" text null,
"archiveLink" text null,
"safeBrowsing" text null,
primary key ("pageUrl")
);
然后创建全文搜索索引:
create virtual table fts using fts5(
content='pages',
content_rowid='pageUrl',
pageDomain,
pageTitle,
pageText,
pageDescription
);
那么我想在 "pages" table 通过插入或删除更新时更新 fts 索引。
我要插入的触发器:
create trigger afterPagesInsert after insert on pages begin
insert into fts(
rowid,
pageDomain,
pageTitle,
pageText,
pageDescription
)
values(
new.pageUrl,
new.pageDomain,
new.pageTitle,
new.pageText,
new.pageDescription
);
end;
删除触发器:
create trigger afterPagesDelete after delete on pages begin
insert into fts(
fts,
rowid,
pageDomain,
pageTitle,
pageText,
pageDescription
)
values(
'delete',
old.pageUrl,
old.pageDomain,
old.pageTitle,
old.pageText,
old.pageDescription
);
end;
这是我正在使用的 sql 插入语句的示例:
insert into "pages" (
"pageUrl",
"dateCreated",
"pageDomain",
"pageTitle",
"pageText",
"pageDescription",
"archiveLink",
"safeBrowsing"
)
values(
'https://www.reddit.com/',
1456465040177,
'reddit.com',
'reddit: the front page of the internet',
'reddit: the front page of the internet',
'reddit: the front page of the internet',
NULL,
NULL
)
删除语句:
delete from "pages" where "pageUrl" = 'https://www.reddit.com/'
但是,插入和删除触发器都出现 SQLITE_MISMATCH: datatype mismatch] errno: 20, code: 'SQLITE_MISMATCH'
错误,我猜这似乎表明错误的数据进入了错误的列,但我不知道为什么。我已经浏览了 docs here 外部内容表部分中的触发器部分,并且我已经按照列出的内容进行操作,所以我不确定哪里出错了。
如有任何帮助,我们将不胜感激。
注意:我使用的是fts5版本的SQLite全文搜索:https://www.sqlite.org/fts5.html
content_rowid
必须引用实际 table 的 rowid,即 INTEGER PRIMARY KEY 列。