SQLite触发器问题

时间:2018-01-20 01:02:57

标签: 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 integer) from StudentData); 
END

StudentsDataDuration列中定义为INTEGERStartDatetimeEndDatetime定义为TEXT

这是我的问题。

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

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

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

触发后的表格结果。

Table results after trigger.

选择查询结果

Select Query results.

1 个答案:

答案 0 :(得分:2)

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

此外,在插入行之前,还有哪些内容需要更新?我不认为这可以通过类比来做; 在你建造墙壁之前画墙

现在你可以在插入后更新,但是在使用UPDATE时需要小心,即如果你想更新除了所有行之外的任何东西,那么你需要将更新限制为所需的行。 WHERE子句可以做到这一点。

因此,如果您要确保插入的列设置为无效值(就您的数据视图而言,例如 -1 的持续时间仅适合Dr. Who(< em>向任何其他时间旅行者道歉))。

也可以使用Null。

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

CREATE TRIGGER duration_trigger001
AFTER INSERT on StudentData 
BEGIN 
        UPDATE StudentData SET duration =  ((julianday(enddatetime) - julianday(startdatetime)) * 24 * 60 * 60) WHERE duration = -1;
END;

会工作,例如: -

enter image description here

注释

  • 在创建触发器之前添加了前两行。
  • 第10行被删除,因为我使用过。而不是:作为分隔符,它什么也没做。
  • 我没有因为简单/懒惰而加入INT。