我可以在sqlite中插入触发器之前更新新的吗?
例如:我可以在sqlite中插入触发器之前更新新的吗?,sql,sqlite,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; 换个新的,没用, 我无法更改数据库结构(可以设置默认值)。 插入后触发器也不适合,因为“NOTNULL”约束。 我找到的唯一解决方案是: insert into tes
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;
换个新的,没用,
我无法更改数据库结构(可以设置默认值)。
插入后触发器也不适合,因为“NOTNULL”约束。
我找到的唯一解决方案是:
insert into test values (New.id, now());
select raise(ignore);
测试数据库仅用于说明目的,在实践中,使用计算数据的情况更为复杂。可能有类似于“updatenewset New.t=now()”的内容,或者没有?不,您不能更新新内容 我倾向于使用带有INSTEAD而非触发器的视图,因为mu要缩短注释 在您的情况下,最好的解决方案可能是在NEW.t为NULL时使用AFTER INSERT/UPDATE触发器来更新受影响行中的t:
仅供参考,您的
id
列可能应该声明为整数主键…您可以使用INSTEAD OF触发器创建一个视图,并将其插入视图中吗?这也是决策的一种变体,但不能解决问题。在我的例子中,表是在同步过程中创建的。我可以在之后运行任何ddl。在主数据库模型中,也使用触发器和设置stmt。我可以创建视图,但必须更改和编程(如果可以…)是的,选择提升(忽略)方法有效。@Nico看起来有些注释已在此处删除,请解释提升(忽略)方法好吗?我不适合此选项,因为“非空”约束-插入失败,为空:(PS,不应该让新手感到困惑,最好使用update…其中rowid=new.rowidWell,假设您有这个触发器,那么t将不为NULL,所以您可以删除该约束。至于rowid…我暗示了这一点,但您是对的,新手可能不会得到提示。另一方面,并非所有RDBMS都有rowid…是的,基本上是SQLite3总是有一个rowid,但是您可以有一个名为rowid
的列,这些列不是整数主键,所以我觉得建议您使用显式整数主键会更安全。
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;