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

时间:2014-11-01 00:37:55

标签: android sqlite android-sqlite triggers

userNotesTable:

_id integer primary key,
name text,
extra text

userRemindersTable:

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

INSERT TRIGGER:

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

UPDATE TRIGGER:

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提醒表全部在更新触发器内。

插入发生时,idnoteid会插入到提醒和搜索表中,但我希望能够使用特定名称更新搜索表,并从用户注释表中更新,这可能吗?

1 个答案:

答案 0 :(得分:0)

所呈现的代码中有一些异常,所以我已经使用它,修改它以便它运行,并给出足够的示例,你应该能够使用它来实现它你想要什么。

这里的主要问题是,要更新触发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。这允许处理INSERTed或UPDATEd的每一行,而不是每次执行一次毯子更新语句。我还省略了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中的记录后,name中的extrasearchTable字段将根据相应的noteid进行设置。

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