【问题标题】:Update Trigger - Updating table other than trigger table更新触发器 - 更新触发器表以外的表
【发布时间】:2014-11-01 00:37:55
【问题描述】:

用户注释表:

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

这是数据库的当前代码及其对提醒表的特定触发器。我遇到的困难是从提醒表中的特定noteid 中的用户注释表中select 特定的nameextra都在更新触发器中。

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

【问题讨论】:

  • 是否有意将 INSERT 和 UPDATE 触发器共享同一个名称 (trigger_name)?
  • 是的。关于如何从提醒中使用特定 noteid 从用户注释表中选择名称和其他内容的任何建议?

标签: android sqlite android-sqlite triggers


【解决方案1】:

提供的代码中有一些异常,所以我已经使用它,对其进行了一些修改以使其运行,并给出了足够的示例,您应该能够使用它来完成它你想要什么。

这里的主要问题是,要更新触发 ON UPDATE 触发器的表以外的表,需要连接表和 SQLite doesn't support such an update statement

我使用了一个名为 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 列被命名为_id,而另一些被命名为id,所以我将它们都命名为_id。创建触发器时,其中的代码没有捕捉到这一点;相反,当触发器执行时,我得到了一个运行时错误。

请注意,在触发器中,我已为每个触发器添加了 FOR EACH ROW。这允许处理插入或更新的每一行,而不是每次执行只执行一个全面更新语句。我还省略了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 中创建记录。然后,当我在userRemindersTable 中创建一些记录时,INSERT 触发器触发并将相应的记录插入searchTable

userRemindersTable中的记录更新时,searchTable中的nameextra字段根据对应的noteid设置。

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

【讨论】:

  • 救了我的命,谢谢!
猜你喜欢
  • 2023-03-11
  • 2012-12-20
  • 2017-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多