Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在sqlite中插入触发器之前更新新的吗?_Sql_Sqlite - Fatal编程技术网

我可以在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;