#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;