当前位置: 首页 > 知识库问答 >
问题:

更新触发器-更新触发器表以外的表

夏侯智鑫
2023-03-14

userNotesTable:

_id integer primary key,
name text,
extra text

用户提醒表:

_id integer primary key,
noteid ineteger,
FOREIGN KEY(noteid) REFERENCES userNotesTable(id) ON DELETE CASCADE

插入触发器:

CREATE TRIGGER trigger_name
AFTER INSERT ON userRemindersTable BEGIN INSERT INTO searchTable (id,noteId)
VALUES (new.id,new.noteId); 
END;

更新触发器:

CREATE TRIGGER trigger_name
AFTER UPDATE ON userRemindersTable BEGIN 
UPDATE searchTable SET _id = new._id, noteid = new.noteid WHERE id IS new.id;
UPDATE searchTable SET name = new.name, extra  = new.extra WHERE id IS new.noteid;
END;

这是数据库的当前代码,以及提醒表的特定触发器。我遇到的困难是,从提醒表中的specificnoteid中的user notes表中选择特定的名称和额外的内容,所有这些都在更新触发器中。

插入时,idnoteid会被插入到提醒和搜索表中,但我希望能够使用特定名称和用户注释表中的额外内容更新搜索表,这可能吗?

共有1个答案

赵雪峰
2023-03-14

在给出的代码中有一些异常,所以我使用了它,对它进行了一些修改,使其能够运行,并给出了足够多的示例,您应该能够使用它来实现您想要的功能。

这里的主要问题是,要更新触发ON update触发器的表之外的表,必须连接表,而SQLite不支持这样的update语句。

我使用了一个名为SQLite Studio的实用工具来重新创建场景。它可以在这里找到:http://sqlitestudio.pl/?act=download

这是我用来重建数据库的代码:

CREATE TABLE userNotesTable ( 
    _id   INTEGER PRIMARY KEY,
    name  TEXT,
    extra TEXT 
);

CREATE TABLE userRemindersTable ( 
    _id    INTEGER PRIMARY KEY,
    noteid INTEGER,
    FOREIGN KEY ( noteid ) REFERENCES userNotesTable ( _id ) ON DELETE CASCADE 
);

CREATE TABLE searchTable ( 
    _id    INTEGER PRIMARY KEY,
    noteId INTEGER,
    name   TEXT,
    extra  TEXT 
);

我注意到一些ID列被命名为\u ID,而另一些则被命名为ID,所以我把它们都命名为\u ID。当触发器被创建时,其中的代码没有捕捉到这一点;相反,当触发器执行时,我得到了一个运行时错误。

在触发器中,请注意,我为每一行添加了FOR。这使得插入或更新的每一行都能被处理,而不是每次执行一个整体更新语句。我还省略了searchTable中ID列的更新,因为更新将列值设置为自身。

下面是触发器创建DDL:

CREATE TRIGGER trg_userRemindersTable_onInsert
AFTER INSERT ON userRemindersTable 
for each row
begin
    INSERT INTO searchTable (_id, noteId)
    VALUES (new._id, new.noteId); 
end;


CREATE TRIGGER trg_userRemindersTable_onUpdate
AFTER UPDATE ON userRemindersTable 
for each row
begin


    UPDATE searchTable
    SET name = (SELECT name
      FROM userNotesTable
      WHERE _id = new.noteId)
    where noteId = new.noteId;             


    UPDATE searchTable
    SET extra = (SELECT extra
      FROM userNotesTable
      WHERE _id = new.noteId)
    where noteId = new.noteId;              


END;

我测试了在userNotesTable中创建记录。然后,当我在用户提醒表中创建一些记录时,INSERT触发器触发,并将相应的记录插入搜索表

更新用户提醒表中的记录时,搜索表中的名称额外字段将根据相应的注释ID设置。

我假设userRemindersTable中有一些字段被省略了,因为实际上没有什么要更新的(为了测试,我更新了_id字段)。此外,对于INSERT触发器,我故意忽略了name额外字段的设置,因为它们在问题中没有提到,尽管它们可能也需要添加到ON INSERT触发器中的INSERT语句中。

 类似资料:
  • 问题内容: 我是SQL的新手,有人可以帮助我修复触发器问题吗? 我有这两个表(“评论”和“报价”),我想更新“评论”表,然后在“插入”,“更新”和“删除”中获取要约表中的数据。如果更新成功,我想使用ReviewId和ReviewDate更新商品表。 我正在使用Azure提供的SQL Server。 UserKey和Asin是唯一的值,所以这就是我用来链接这些表的东西。我将非常感谢您的帮助! 桌子:

  • 问题内容: 我有一个触发器,我正尝试使用它来更新它侦听的同一张表。 但是,提交创建或更新后,出现以下错误: 感谢您的帮助! 问题答案: 您正在更新触发器已写入的同一表。您需要这样的东西:

  • 问题内容: 我有一个Maximo数据库,该数据库具有无法更改的表结构。我希望在创建或更新主电子邮件地址时将其复制到PERSON表中。以下结构描述了PERSON表和EMAIL表 PERSON表: EMAIL表: 如您所见,这两个表在PERSONID列上链接。这是我希望触发器执行的操作: 如果EMAIL表已更新或插入了新行,那么如果ISPRIMARY字段,我想将EMAILADDRESS字段复制到PER

  • 问题内容: 在oracle中,我可以指定列,这将引发触发器的触发: 现在,我想执行以下操作:当 只 更新 一 列时,我不希望触发触发器。这怎么可能? 我可以列出除那一列之外的所有列,该列不应引起触发器的触发。对于具有许多列的表而言,这非常麻烦。 另一种方法是使用像这样的UPDATING函数: 但是,如果我立即更改了COL1 和 COL3,则该语句的计算结果为false。那不是我想要的,因为我只想更

  • 我创建了一个用于插入和更新的SQL触发器,它基本上执行以下操作: 从插入的表中获取LineID(表的PrimaryID)和RegionID,并将其存储在INT变量中。然后,它对连接表进行检查,以找到RegionID应该是什么,如果RegionID不等于插入表中应该是什么,那么它应该更新该记录。 我的问题是,它没有更新记录,我猜,这是因为记录还没有插入到PurchaseOrderLine表中,我正在

  • 问题内容: 在同一张表上更新后,如何在触发器中更新表的列? 这是触发条件: 现在当我像这样更新表时 这不起作用,因为我得到以下信息: 那么我到底该如何工作呢? 问题答案: 如果将触发器更改为而不是,可以这样操作: