2012-02-20 97 views
9

例如:在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 =现在()”,或不?

+0

你可以创建一个视图与INSTEAD OF触发器,并插入到视图? – 2012-02-20 06:42:02

+0

这也是一个决定的变体,但不能解决问题。在我的情况下,表是在同步过程中创建的。之后我可以运行任何ddl。 – lunicon 2012-02-20 07:08:34

+0

在主数据库模型中也使用set stmt触发器。我可以创建视图,但必须更改和编程(如果我可以...) – lunicon 2012-02-20 07:16:51

回答

6

不,你不能更新新的。

我倾向于做的是使用一个视图与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 ...

+0

我不适合,因为“非空”约束这个选项 - 将失败,空:(PS,不应该混淆新人,更好地利用更新...其中的ROWID = new.rowid – lunicon 2012-03-02 22:04:59

+0

好吧,既然你有这样的触发t不会是NULL,所以你可以放弃这个约束,至于rowid ...我暗示了这一点,但你说得对,新手可能不会得到提示。另一方面,并​​不是所有的RDBMS总是有rowid ..是的,SQLite3基本上总是有一个rowid,_but_你可以有名为'rowid'的列不是INTEGER PRIMARY KEY,所以我觉得建议你有一个明确的INTEGER PRIMARY KEY会更安全。 – Nico 2012-03-05 23:15:52