Возникли проблемы с триггером удаления в таблице sqlite FTS5

#sql #sqlite

Вопрос:

У меня возникли проблемы с корректной работой триггера удаления с моей таблицей sqlite FTS5. База данных состоит из ~100 таблиц. В каждой таблице содержится информация и подробные сведения о различных категориях товаров. Все таблицы продуктов имеют два одинаковых столбца: Manufacturer_Part_Number, Vendor_Part_Number

Чтобы сделать всю базу данных доступной для поиска по любой части#, создается таблица FTS, содержащая столбцы для этих двух номеров деталей, а также идентификатор строки и исходную таблицу, из которой была получена запись. Таким образом, таблица FTS может быть запрошена с помощью части#, и в результате будет получен идентификатор строки и исходная таблица, в которой может быть расположена запись. У меня есть настройка триггеров для обновления таблицы FTS при вставке или удалении записей из фактических таблиц данных. Вставки отлично работают, а поиск и извлечение записей отлично работают. Проблема в удалении записей.

Если я попытаюсь удалить запись из одной из таблиц данных, для таблицы FTS активируется триггер, и появляется сообщение об ошибке: ‘sqlite3.Ошибка операции: 5 значений для 4 столбцов

Я не знаю, в чем проблема с моим триггером удаления. Это похоже на то, как если бы ключевое слово «удалить» интерпретировалось как значение. Это используется в настройках python с использованием плагина sqlite3

Вот код для создания одной таблицы данных:

 CREATE TABLE Jacks( 
id INTEGER PRIMARY KEY,
Manufacturer_Part_Number text NOT NULL UNIQUE,
Manufacturer text,
Description text, 
Vendor_Part_Number text,
Series text,
Part_Status text,
Type text,
Gender text,
Plug_Mating_Plug_Diameter text,
Mounting_Type text,
Termination text,
Insulation text,
Features text,
Color text,
"Datasheet URL" text,
category text, 
subcategory text);
 

Вот создание таблицы FTS:

 CREATE VIRTUAL TABLE searchTable USING FTS5(
manufacturer_part_number, 
vendor_part_number, 
src_row,
src_table);
 

Вот триггеры FTS:

 CREATE TRIGGER Jacks_after_insert AFTER INSERT ON Jacks
BEGIN
    INSERT INTO searchTable (src_row, manufacturer_part_number, vendor_part_number, src_table)
    VALUES (new.id, new.{manufacturer_part_number}, new.{vendor_part_number}, "Jacks");
END;

CREATE TRIGGER Jacks_after_delete AFTER DELETE ON Jacks
    BEGIN
        INSERT INTO searchTable (src_row, manufacturer_part_number, vendor_part_number, src_table)
        VALUES ('delete', old.id, old.manufacturer_part_number, old.vendor_part_number, "Jacks");
    END;

CREATE TRIGGER Jacks_after_update AFTER UPDATE ON Jacks
    BEGIN
        INSERT INTO searchTable (src_row, manufacturer_part_number, vendor_part_number, src_table)
        VALUES ('delete', old.id, old.manufacturer_part_number, old.vendor_part_number, "Jacks");
        INSERT INTO {search_table} (src_row, manufacturer_part_number, vendor_part_number, src_table)
        VALUES (new.id, new.{manufacturer_part_number}, new.{vendor_part_number}, "Jacks");
    END;
 

Есть какие-нибудь идеи?
Спасибо

Ответ №1:

**РЕДАКТИРОВАТЬ

Понял это. Я не уверен, почему предыдущий триггер удаления не работал, но этот триггер удаления работает. Это принимает другую форму:

 CREATE TRIGGER Jacks_after_delete AFTER DELETE ON Jacks
FOR EACH ROW
BEGIN
    DELETE FROM searchTable WHERE (old.id = src_row);
END;