为什么SQLite给出了无法在表上创建而不是触发器

Ste*_*ing 1 sqlite triggers android-sqlite

有了这张桌子

create table FOLDER
(
    _ID integer primary key autoincrement,
    NAME text not null,
    PARENT integer not null,
    DELETED integer,
    constraint VALUEOF_folder_deleted check (DELETED == 1 or DELETED isnull) on conflict abort,
    unique (NAME, PARENT) on conflict abort
);
Run Code Online (Sandbox Code Playgroud)

我想替换存在NAME PARENT组合的插入,并将DELETED设置为1,并将替换设置为DELETED字段为null.

我试过这个触发器:

CREATE TRIGGER REPLACE_INS_folder instead of insert on FOLDER
when exists (select 1 from FOLDER where NAME == new.NAME and PARENT == new.PARENT and DELETED == 1)
begin
    update FOLDER set DELETED = null where NAME == new.NAME and PARENT == new.PARENT;
end;
Run Code Online (Sandbox Code Playgroud)

但收到: Error: cannot create INSTEAD OF trigger on table: FOLDER

最初我在触发器中遇到语法错误,但收到了相同的错误,表明存在更严格的限制.本文档中的图表https://www.sqlite.org/lang_createtrigger.html表明我的触发器有效.但是,文本的第二部分A trigger may be specified to fire whenever a DELETE, INSERT, or UPDATE of a particular database table occurs, or whenever an UPDATE occurs on on one or more specified columns of a table.让我想知道WHEN是否只允许使用更新触发器.

请注意,这是表上的触发器,而不是视图上的触发器.

CL.*_*CL. 6

文件说:

通过在CREATE TRIGGER语句中指定INSTEAD OF,可以在视图和普通表上创建触发器.

这是相当误导的.这句话实际上试图说的是

  • 在普通表上,您只能使用BEFORE和AFTER触发器
  • 在视图上,您​​只能使用INSTEAD OF触发器.

您不能在表上使用INSTEAD OF触发器.将其更改为视图:

CREATE TABLE FolderTable(...);
CREATE VIEW Folder AS SELECT * FROM FolderTable;
CREATE TRIGGER ... INSTEAD OF INSERT ON Folder ...;
Run Code Online (Sandbox Code Playgroud)

(然后你还需要INSTEAD OF UPDATE/DELETE触发器.)

  • 文档不是很有帮助.我查找了一个报告文档错误的链接,但没有.我只是针对表格编写测试代码. (2认同)