Создание триггеров SQL для индекса полнотекстового поиска в SQLite

Я пытаюсь создать триггеры для обычной таблицы, чтобы затем обновить полнотекстовый индекс в 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
);

Итак, я бы хотел обновить индекс 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' как для триггера вставки, так и для триггера удаления, который, как мне кажется, указывает на то, что неправильные данные поступают в неправильный столбец, но я не уверен, почему. Я просмотрел раздел триггеров в разделе "Таблицы внешнего контента" в этой документации и следил за тем, что было в списке, поэтому я не уверен, в чем я ошибаюсь.

Любая помощь будет оценена.

примечание: я использую fts5 версию полнотекстового поиска SQLite: https://www.sqlite.org/fts5.html

1 ответ

Решение

content_rowid должен ссылаться на rowid фактической таблицы, то есть на столбец INTEGER PRIMARY KEY.

Другие вопросы по тегам