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
提醒表全部在更新触发器内。
插入发生时,id
和noteid
会插入到提醒和搜索表中,但我希望能够使用特定名称更新搜索表,并从用户注释表中更新,这可能吗?
答案 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
中的extra
和searchTable
字段将根据相应的noteid
进行设置。
我假设userRemindersTable
中有一些省略的字段,因为没有任何要更新的内容(为了测试,我更新了_id
字段)。此外,对于INSERT触发器,我故意省略了name
和extra
字段的设置,因为问题中没有提到它们,尽管它们可能也需要添加到INSERT语句中。 ON INSERT触发器。