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是否只允许使用更新触发器.
请注意,这是表上的触发器,而不是视图上的触发器.
该文件说:
通过在CREATE TRIGGER语句中指定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触发器.)