SQLite触发问题

SQLite触发问题,sqlite,triggers,Sqlite,Triggers,我在一个表上有一个触发器,它在任何新插入时都会被触发…下面是触发器的代码。此触发器必须以秒为单位计算持续时间,并在表中插入记录 CREATE TRIGGER duration_trigger BEFORE INSERT on StudentData BEGIN UPDATE StudentData set duration = (select cast( (julianday(enddatetime) - julianday(startdatetime) ) *24 * 60 *60 as

我在一个表上有一个触发器,它在任何新插入时都会被触发…下面是触发器的代码。此触发器必须以秒为单位计算持续时间,并在表中插入记录

CREATE TRIGGER duration_trigger 
BEFORE INSERT on StudentData 
BEGIN 
UPDATE StudentData set duration = (select cast( (julianday(enddatetime) - julianday(startdatetime) ) *24 * 60 *60 as integer) from StudentData); 
END
StudentsData
Duration
中,列定义为
INTEGER
StartDatetime
EndDatetime
定义为
TEXT

我的问题来了

触发器被触发,但持续时间列中的值始终为
7

当我在SQL工具的触发器中执行相同的select查询时,它以秒为单位给出了正确的持续时间。数据库上的触发器没有产生相同的结果…可能是什么问题

我还附加了表中触发器数据的屏幕截图,并从同一个表中选择查询结果

触发后的表结果

选择查询结果


基本上,您正在更新所有行,因为您没有为更新指定WHERE子句。因此,最后一次成功的更新将把该值应用于所有行,因此它们都是7

此外,在插入行之前,还有什么需要更新的?我不认为这是可以做到的一个类比会是;在建造墙之前,请先油漆墙

现在,您可以在插入后进行更新,但在使用UPDATE时需要小心,即如果您想更新除所有行以外的任何行,则需要将更新限制到所需的行。WHERE子句可以做到这一点

同样,如果您要确保将插入的列设置为无效值(就您对数据的看法而言,例如,-1的持续时间只适合Who博士(向任何其他时间旅行者道歉))

也可以使用Null

但是,我更喜欢使用专门设置的值。假设插入行时duration的值为-1(例如
duartion INTEGER DEFAULT-1
),则:-

将起作用,例如:-

笔记
  • 前两行是在创建触发器之前添加的
  • 第10行已删除,因为我使用了。代替:作为分隔符,它什么也没做
  • 我并不是因为简单/懒惰而将其转换为INT

谢谢@MIkeT。这就解决了问题。谢谢你的帮助。
CREATE TRIGGER duration_trigger001
AFTER INSERT on StudentData 
BEGIN 
        UPDATE StudentData SET duration =  ((julianday(enddatetime) - julianday(startdatetime)) * 24 * 60 * 60) WHERE duration = -1;
END;