【发布时间】:2021-11-28 00:29:59
【问题描述】:
我无法让删除触发器与我的 sqlite FTS5 表一起正常工作。该数据库由约 100 个表组成。每个表都包含不同产品类别的信息和详细信息。所有产品表都有两列相同: 制造商零件编号 Vendor_Part_Number
为了使整个数据库可以通过任一部件号进行搜索,创建了一个 FTS 表,其中包含这两个部件号的列,以及记录来自的 row_id 和源表。这样可以使用part#查询FTS表,结果给出记录所在的row_id和源表。当从实际数据表中插入或删除记录时,我设置了触发器来更新 FTS 表。插入效果很好,搜索和检索记录效果很好。问题在于删除记录。
如果我尝试从其中一个数据表中删除记录,则会为 FTS 表激活触发器,并报告错误: 'sqlite3.OperationalError: 4 列的 5 个值'
我不知道我的删除触发器有什么问题。好像“删除”关键字被解释为一个值。这是在 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;
有什么想法吗? 谢谢
【问题讨论】: