在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;
集New.t没有工作,where can be only select/insert/update/delete stmt. 我不能更改数据库结构(可以设置默认值)。 由于“非空”限制,插入触发器也不适合。 我发现的唯一的解决办法:用于说明目的
insert into test values (New.id, now());
select raise(ignore);
测试数据库而已,在实践中也有更复杂的情况下计算得到的数据。有可能是这样的“更新新集New.t =现在()”,或不?
不,你不能更新新的。
我倾向于做的是使用一个视图与INSTEAD OF触发器作为亩短评论。
在您的情况最好的解决办法可能是使用AFTER INSERT/UPDATE触发器时NEW.t为null,则受影响的行(S)在更新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;
仅供参考,您的id
列应可能被宣布为INTEGER PRIMARY KEY ...
我不适合,因为“非空”约束这个选项 - 将失败,空:(PS,不应该混淆新人,更好地利用更新...其中的ROWID = new.rowid – lunicon 2012-03-02 22:04:59
好吧,既然你有这样的触发t不会是NULL,所以你可以放弃这个约束,至于rowid ...我暗示了这一点,但你说得对,新手可能不会得到提示。另一方面,并不是所有的RDBMS总是有rowid ..是的,SQLite3基本上总是有一个rowid,_but_你可以有名为'rowid'的列不是INTEGER PRIMARY KEY,所以我觉得建议你有一个明确的INTEGER PRIMARY KEY会更安全。 – Nico 2012-03-05 23:15:52
你可以创建一个视图与INSTEAD OF触发器,并插入到视图? – 2012-02-20 06:42:02
这也是一个决定的变体,但不能解决问题。在我的情况下,表是在同步过程中创建的。之后我可以运行任何ddl。 – lunicon 2012-02-20 07:08:34
在主数据库模型中也使用set stmt触发器。我可以创建视图,但必须更改和编程(如果我可以...) – lunicon 2012-02-20 07:16:51