我可以在sqlite中插入触发器之前更新New吗?

lun*_*con 14 sql sqlite

例如:

create table test (id numeric, t date not null);

create trigger test_in
before insert on test
for each row
when New.t is null
begin
 -- set New.t = now();
end;
Run Code Online (Sandbox Code Playgroud)

设置New.t不起作用,其中只能选择/插入/更新/删除stmt. 我无法更改数据库结构(可以设置默认值).插入触发器后也因为"not null"约束而不适合.我找到的唯一解决方案:

insert into test values (New.id, now());
select raise(ignore);
Run Code Online (Sandbox Code Playgroud)

测试数据库仅用于说明目的,实际上存在计算数据的更复杂的情况.可能有这样的"更新New set New.t = now()",或不?

小智 10

不,你不能更新NEW.

我倾向于使用具有INSTEAD OF触发器的VIEW,因为mu是短评论.

在您的情况下,最好的解决方案可能是使用AFTER INSERT/UPDATE触发器,当NEW.t为NULL时,在受影响的行中更新t:

CREATE TRIGGER test_in
AFTER INSERT ON test
FOR EACH ROW
WHEN (NEW.t IS NULL)
BEGIN
   UPDATE test SET t = now() WHERE id = NEW.id;
END;
Run Code Online (Sandbox Code Playgroud)

仅供参考,你的id专栏应该被宣布为INTEGER PRIMARY KEY ...