gpt4 book ai didi

triggers - 为什么 SQLite 给出 Cannot create而不是在表上创建触发器

转载 作者:行者123 更新时间:2023-12-02 17:56:53 26 4
gpt4 key购买 nike

有了这张表

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

我想用将 DELETED 字段设置为 null 的替换来替换存在 NAME PARENT 组合且 DELETED 设置为 1 的插入。

我尝试了这个触发器:

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;

但收到:错误:无法在表:FOLDER 上创建 INSTEAD OF 触发器

最初,我在触发器中遇到了语法错误,但收到了相同的错误,表明存在更严格的限制。本文档中的图表https://www.sqlite.org/lang_createtrigger.html表明我的触发器有效。但是,文本的第二部分可以指定每当特定数据库表发生 DELETE、INSERT 或 UPDATE 时,或者每当表的一个或多个指定列发生 UPDATE 时触发触发器。 让我想知道 WHEN 是否只允许与更新触发器一起使用。

请注意,这是表上的触发器,而不是 View 上的触发器。

最佳答案

documentation说:

Triggers may be created on views, as well as ordinary tables, by specifying INSTEAD OF in the CREATE TRIGGER statement.

这是相当误导的。这句话其实想表达的是

  • 在普通表上,您只能使用 BEFORE 和 AFTER 触发器,但是
  • 在 View 上,您​​只能使用 INSTEAD OF 触发器。

您不能在表上使用 INSTEAD OF 触发器。将其更改为 View :

CREATE TABLE FolderTable(...);
CREATE VIEW Folder AS SELECT * FROM FolderTable;
CREATE TRIGGER ... INSTEAD OF INSERT ON Folder ...;

(然后您还需要 INSTEAD OF UPDATE/DELETE 触发器。)

关于triggers - 为什么 SQLite 给出 Cannot create而不是在表上创建触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30323487/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com