【问题标题】:Having trouble with delete trigger on sqlite FTS5 tablesqlite FTS5 表上的删除触发器有问题
【发布时间】: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;

有什么想法吗? 谢谢

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

    **编辑

    想通了。我不确定为什么以前的删除触发器不起作用,但这个删除触发器有效。它采用不同的形式:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-14
      • 1970-01-01
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多